2017-11-10 7 views
2

Play 2.6アプリのテスト設定でハンドルを取得できません。私はとのスペックを持っている署名のような:注入モジュールの設定が不良です

[info] com.typesafe.config.ConfigException$UnresolvedSubstitution: newsroom.conf @ file:/Users/ben/src/nissan-global/modules/newsroom/target/scala-2.11/classes/newsroom.conf: 466: Could not resolve substitution to a value: ${user.dir} 
[info] at com.typesafe.config.impl.ConfigReference.resolveSubstitutions(ConfigReference.java:108) 
[info] at com.typesafe.config.impl.ResolveContext.realResolve(ResolveContext.java:179) 
[info] at com.typesafe.config.impl.ResolveContext.resolve(ResolveContext.java:142) 
[info] at com.typesafe.config.impl.ConfigConcatenation.resolveSubstitutions(ConfigConcatenation.java:205) 
[info] at com.typesafe.config.impl.ResolveContext.realResolve(ResolveContext.java:179) 
[info] at com.typesafe.config.impl.ResolveContext.resolve(ResolveContext.java:142) 
[info] at com.typesafe.config.impl.SimpleConfigObject$ResolveModifier.modifyChildMayThrow(SimpleConfigObject.java:379) 
[info] at com.typesafe.config.impl.SimpleConfigObject.modifyMayThrow(SimpleConfigObject.java:312) 
[info] at com.typesafe.config.impl.SimpleConfigObject.resolveSubstitutions(SimpleConfigObject.java:398) 
[info] at com.typesafe.config.impl.ResolveContext.realResolve(ResolveContext.java:179) 

でbuild.sbt私のテストはこのように構成されています:

fork in IntegrationTest := true 
fork in Test := true 

javaOptions in Test += "-Dconfig.resource=test.conf" 

どれを

class ChannelsComponentSpec extends PlaySpec with ServicesSpec with GuiceOneAppPerSuite { 

    val environment = app.environment.asJava 
    val servicesModule: ServicesModule = app.injector.instanceOf[ServicesModule] 

私のテストは、基本的な置換が不足して中止されヒント?私はそのような仕様がどこの設定から得られるかを本当に理解していません。

答えて

1

app\conftest\resourcesの設定ファイルは、デフォルトでクラスパスに含まれています。アプリケーションコンフィギュレーションファイルの名前がapplication.confの場合、Typesafe設定ライブラリを直接使用するかどうかは特に指定する必要はありません。ConfigFactory.load()またはPlayのconfiguration wrapperタイプセーフ設定ライブラリ用です。

alternative config fileは、クラスパス上またはファイルシステム上で指定できます。設定ファイルはapp/conf/test.confでクラスパス上にある、と言う、設定ファイルがアプリケーションのクラスパス上にない場合、それは、一方

-Dconfig.resource=test.conf 

で指定されているが、どこか外のファイルシステムでは、たとえば、/etc/myapp/test.confで、それはいずれの場合も

-Dconfig.file=/etc/myapp/test.conf  

で指定され、我々は最初の行

include "application" 
012として有すること test.conf内のデフォルトのアプリケーション構成 app/conf/application.confを含むことができ

application.confの特定のプロパティを、対応するテスト値で上書きできます。

フォークJVMでby default実行テストを再生するので、私たちはフォークJVMにシステムプロパティを渡すためにjavaOptions SBT設定を使用する必要があります。

javaOptions in Test += "-Dconfig.resource=test.conf" 
javaOptions in IntegrationTest += "-Dconfig.resource=integrationtest.conf" 

設定ファイルが開始SBTがロードされている正確に何を参照するにはあなたの特定の問題については例えば

-Dconfig.trace=loads 

sbt -Dconfig.trace=loads run

と、それを${user.dir}は、user.dirが、どのディレクトリからアプリを起動したかを指定する標準のJVMシステムプロパティであるため、代替できません。システムプロパティへのアクセスを制限するセキュリティポリシーがありますか?

+0

ありがとうMario。不思議なことに、$ {user.dir}の置換はあなたのconfig.trace = loadを使って表示され、正しく表示されます: '' 'user.dir =/home/blaha/src/myProject''' – blaha

+0

一時的に値をハードコピーする試してみてください"/home/blaha/src/myProject "を' newsroom.conf:466'に置き換えて再実行します。あなたはどこまで手に入りますか? –

+0

私は次のconfの置換試行の可能性が高いところでNullPointerExceptionを受け取ります。私の特質の一つである 'config.getString'です。興味深いことに、nullのconf値は、私が進めるためにハードコーディングしたのと全く同じ 'newsroom.conf'に設定されているものです。 – blaha

関連する問題