FakeApplicationと埋め込みmongodbデータベースを使用するspecs2テストがあります。
def inMemoryMongoDatabase(name: String = "default"): Map[String, String] = {
val dbname: String = "play-test-" + scala.util.Random.nextInt
Map(
("mongodb." + name + ".db" -> dbname),
("mongodb." + name + ".port" -> EmbeddedMongoTestPort.toString))
}
override def around[T <% Result](t: => T) = {
running(FakeApplication(additionalConfiguration = inMemoryMongoDatabase(), additionalPlugins = Seq("se.radley.plugin.salat.SalatPlugin"))) {
t // execute t inside a http session
}
}
FakeApplicationは、confディレクトリのデフォルトのapplication.conf構成と、各テスト用に作成されたテストデータベースの追加構成を使用します。
これは、mongodbレプリケートセットをセットアップするまで、検索で機能していました。これで、application.confにこのレプリカセットの構成が含まれます
mongodb.default.replicaset {
host1.host = "localhost"
host1.port = 27017
host2.host = "localhost"
host2.port = 27018
host3.host = "localhost"
host3.port = 27019
}
FakeApplicationはデフォルトを使用するため構成レプリカセットのホストが見つからないため、テストは失敗します。テストに別の構成を設定したいのですが、基本的にmongodb.default.replicasetエントリを削除します。 mongodb.default.replicasetが単純なMap [String、String]の場合、additonalConfigurationに追加するだけで簡単ですが、これを実行しようとすると、期待値の型が文字列ではなくオブジェクトであるため失敗します。また、pathパラメーターを介してFakeApplicationに別のtest.confファイルを提供しようとしました。
override def around[T <% Result](t: => T) = {
running(FakeApplication(path = new java.io.File("conf/test.conf"), additionalConfiguration = inMemoryMongoDatabase(), additionalPlugins = Seq("se.radley.plugin.salat.SalatPlugin"))) {
t // execute t inside a http session
}
}
構成をロードしなかったため、これも機能しませんでした。
助けていただければ幸いです。ありがとう。
クリス
回答:
回答№1の場合は10統合テスト用に追加の構成をロードする場合にも、同様の問題が発生しました。マップに手動でデータを入力するのは面倒であることがわかったため、次のアプローチを使用しました。
private Configuration additionalConfigurations;
@Before
public void initialize(){
Config additionalConfig = ConfigFactory.parseFile(new File("conf/integration.conf"));
additionalConfigurations = new Configuration(additionalConfig);
}
@Test
public void testPropertiesGetLoaded() throws Exception{
running(testServer(3333, fakeApplication(additionalConfigurations.asMap())), HTMLUNIT, new Callback<TestBrowser>(){
public void invoke(TestBrowser browser){
String specificProperty = Play.application().configuration().getString("specific.property");
System.out.println(specificProperty);
}
});
}
Scala側に優れたメソッドがあるかどうかはわかりませんが、すべてのコードをJavaで実行しています。
回答№2の場合は3
問題は、PlayのFakeAppicationを使用して統合テストを実行するときにtest.confファイルを指定する方法です。統合テストでは呼び出すことができません play -Dconfig.file=conf/test.conf
.
私が何とかしたことはこれです:
object FakeSalatApp extends Around {
def EmbeddedMongoTestPort: Int = 27028
def inMemoryMongoDatabase(name: String = "default"): Map[String, String] = {
val dbname: String = "play-test-" + scala.util.Random.nextInt
Map(
("mongodb." + name + ".db" -> dbname),
("mongodb." + name + ".port" -> EmbeddedMongoTestPort.toString),
("mongodb." + name + ".replicaset.host1.host" -> "localhost"),
("mongodb." + name + ".replicaset.host1.port" -> EmbeddedMongoTestPort.toString),
("mongodb." + name + ".replicaset.host2.host" -> "localhost"),
("mongodb." + name + ".replicaset.host2.port" -> (EmbeddedMongoTestPort + 1).toString),
("mongodb." + name + ".replicaset.host3.host" -> "localhost"),
("mongodb." + name + ".replicaset.host3.port" -> (EmbeddedMongoTestPort + 2).toString))
}
override def around[T <% Result](t: => T) = {
running(FakeApplication(additionalConfiguration = inMemoryMongoDatabase(), additionalPlugins = Seq("se.radley.plugin.salat.SalatPlugin"))) {
t // execute t inside a http session
}
}
}
答え№3の2
これは私がPlay2.3.xでそれをした方法です
アプリケーションを定義する
GlobalSettings
クラスでAppGlobal
パッケージ内(ルートパッケージではない)package configs class AppGlobal extends GlobalSettings { // Your application global settings ??? }
アプリケーションのグローバル設定を次のように定義します
object Global extends AppGlobal
これはアプリケーションで使用されます。テストクラスで、テストグローバルを定義します。テスト構成は、アプリケーション構成全体をオーバーライドまたは追加するために、最後に追加されます。
object TestGlobal extends AppGlobal { override def onLoadConfig(config: Configuration, path: File, classloader: ClassLoader, mode: Mode): Configuration = { config ++ configuration ++ Configuration.load(path, mode = Mode.Dev, Map("config.file" -> "conf/test.conf")) } }
上記で偽のアプリケーションを作成します
TestGlobal
FakeApplication(withGlobal = Some(TestGlobal))
回答№4の場合は1
私の場合、すべてのテストを拡張する基本クラスを作成しただけです。 FakeApplicationを作成する直前に、システムプロパティを定義します config.resource これにより、アプリケーションの構成が設定されます。 次に、構成を次のように構成しました。
application.conf:環境固有の構成は含まれていません
test.conf:application.confを含み、単体テストを実行するための構成を定義します
env_local.conf:application.confを含み、アプリケーションをローカルで実行するための構成を定義します
env_prod.conf:env_local.confと同様ですが、本番環境など用です..。
私のプロジェクトでは、便宜上、スクリプトlocal.shを作成しました。 アクティベーターを実行するだけです-Dconfig.resource = env_local.conf
@RunWith(classOf[JUnitRunner])
class ApplicationTest extends FunSuite with MockitoSugar {
System.setProperty("config.resource", "test.conf")
val app = Helpers.fakeApplication()
}
回答№5の場合は0
使用 path
これは実行中のFakeApplicationのパスであるため、ここでは機能しません(場合によっては別のパスがある可能性があります)。
あなたの場合に私が提案するのは、 test.conf
Play for testモードを実行しているとき(例:
play -Dconfig.file=conf/test.conf
その後、 test.conf
ピックアップされます。その後、通常の内容を含めることもできます application.conf
モンゴの設定だけをオーバーライドします。
おそらく、「シングルターゲットモード」をデフォルトのmongodbへの接続方法にすることも理にかなっています。 application.conf
、およびmongob構成を上書きして、実稼働構成でのみレプリカセットを使用します。