注入模块配置错误

时间:2017-11-10 19:33:01

标签: playframework scalatest

我无法处理Play 2.6应用程序的测试配置。我有一个带有签名的规范:

class ChannelsComponentSpec extends PlaySpec with ServicesSpec with GuiceOneAppPerSuite {

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

我的测试中止了基本的替换缺失:

[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"

任何提示?我真的不明白这些规格从哪里获得配置。

1 个答案:

答案 0 :(得分:1)

app\conftest\resources中的配置文件默认包含在类路径中。如果应用程序配置文件名为application.conf,那么无论是直接使用Typesafe配置库ConfigFactory.load()还是使用Play configuration wrapper进行Typesafe配置库,都不需要做任何特殊工作。

我们可以在类路径或文件系统上指定alternative config file。比如说,配置文件位于app/conf/test.conf的类路径上,然后用

指定
-Dconfig.resource=test.conf

另一方面,如果配置文件不在应用程序的类路径上,而是在文件系统外的某个位置,例如,在/etc/myapp/test.conf,则使用

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

在任何一种情况下,我们都可以在app/conf/application.conf中包含默认的应用配置test.conf作为第一行

include "application"

现在我们可以使用相应的测试值覆盖application.conf中的特定属性。

Play by default在分叉的JVM中运行测试,因此我们必须使用javaOptions SBT设置才能将系统属性传递给分叉的JVM:

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系统属性,用于指定应用程序启动的目录。是否有一些安全策略可以限制对系统属性的访问?