我想为每种模式(Dev,Prod,Test)加载不同的配置文件,所以我写了以下内容。
class CustomApplicationLoader extends GuiceApplicationLoader {
override protected def builder(context: Context): GuiceApplicationBuilder = {
Logger.info("CUSTOMBUILDER")
val builder = initialBuilder.in(context.environment).overrides(overrides(context): _*)
val mode = context.environment.mode
val configFile = s"application.${mode.toString.toLowerCase}.conf"
Logger.info("Using config file: %s".format(configFile))
val config = Configuration(ConfigFactory.load(configFile))
builder.loadConfig(config ++ context.initialConfiguration)
}
}
在我的application.conf文件中,我有
play.application.loader = "modules.CustomApplicationLoader"
这在Prod和Dev模式下完美无效,但在测试模式下无效。在测试模式下,永远不会触发Logger.info(" CUSTOMBUILDER")。
我似乎无法在文档中找到有关为何在测试模式下无效的原因。在测试模式下工作或确定问题根源的任何帮助将不胜感激。
答案 0 :(得分:5)
想出来,希望这可以帮助别人。
作为play2.4和specs2的新手,我没有意识到默认情况下的测试是在没有任何应用程序上下文的情况下运行的。但是我注意到,当使用in new WithApplication
运行时,它们使用默认的应用程序加载器加载。
我的问题的一个快速解决方法是使用非常相似的WithApplicationLoader
代替:
in new WithApplicationLoader(new CustomApplicationLoader)
我最终编写了一个自定义上下文提供程序,将它们捆绑在一起,因为我觉得它更清洁一点:
object TestHelpers {
val customApplicationLoader = new CustomApplicationLoader
val customContext = ApplicationLoader.createContext(new Environment(new java.io.File("."), ApplicationLoader.getClass.getClassLoader, Mode.Test))
abstract class WithCustomApp(applicationLoader: ApplicationLoader = customApplicationLoader, context: ApplicationLoader.Context = customContext) extends Around with Scope {
implicit lazy val app = applicationLoader.load(context)
def around[T: AsResult](t: => T): Result = {
Helpers.running(app)(AsResult.effectively(t))
}
}
}
以下是使用中的示例:
"Status" should {
"receive an ok" in new WithCustomApp {
val car1 = route(FakeRequest(GET, "/status")).get
status(car1) must equalTo(OK)
val body = contentAsString(car1)
body mustEqual "ok"
}
}
这正如我所希望的那样正确加载application.test.conf
。这对于任何特定于测试的配置都很有用,并且对于测试(h2:在内存中)和dev(jdbc:mysql)具有单独的db配置非常方便。