Develop with pleasure!

福岡でCloudとかBlockchainとか。

play testとforked jvm

Playframeworkを2.0.4(SBT 0.11.3)→2.1.0(SBT 0.12.2)にバージョンアップした際に、それまでテスト実行時に指定していた設定ファイルが読み込まれなくなった。

テストの実行は↓のコマンドで実行していたけど、test.confに定義している設定値がどうも有効になっていなかった。(testじゃなくてrunした場合はちゃんとconfファイルを認識してる)

play -Dconfig.file=conf/test.conf test


Play 2.1 のテスト中に、OutOfMemoryError などが出てテストが途中で止まる場合の対策 - scalaとか・・・の内容みると、test実行時にsbtを実行しているJVMとは別にJVMがフォークされ、そのJVMの上でテストが実行されてるところに起因してるくさい。この新たにフォークされたJVMにはsbtを実行する際にコマンドラインで指定したシステムプロパティがロードされていないので、-Dconfig.fileで指定した設定ファイルも認識されてないみたい。

Playな環境でテスト実行時でもシステムプロパティを認識させるには↓の2通りの方法がある。

jvmをforkさせないようにする。Build.scalaに以下のような設定をする。

これやると何かクラスローダーの動作が怪しくjunit関連のクラスでjava.lang.NoClassDefFoundErrorとかが発生する。

val main = play.Project(appName, appVersion, appDependencies, settings = s).settings(
...
  Keys.fork in Test := false
)

システムプロパティをBuild.scalaに定義する。

val main = play.Project(appName, appVersion, appDependencies, settings = s).settings(
...
 javaOptions in Test += "-Dconfig.file=conf/test.conf"
  )


基本的に後者のシステムプロパティをBuild.scalaで定義した方が無難。でも、コマンドラインオプションで指定した条件もフォークしたJVMに渡してくれたら良いのに。。