我无法处理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"
任何提示?我真的不明白这些规格从哪里获得配置。
答案 0 :(得分:1)
app\conf
和test\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系统属性,用于指定应用程序启动的目录。是否有一些安全策略可以限制对系统属性的访问?