Play Framework 2.4.1:在测试模式下忽略play.application.loader设置

ala*_*lav 3 scala guice playframework-2.4

我想为每种模式(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)

    }
}
Run Code Online (Sandbox Code Playgroud)

在我的application.conf文件中

play.application.loader = "modules.CustomApplicationLoader"
Run Code Online (Sandbox Code Playgroud)

这在Prod和Dev模式下完美地工作,但在测试模式下不能.在测试模式下,永远不会触发Logger.info("CUSTOMBUILDER").

我似乎无法在文档中找到有关为什么这在测试模式下不起作用的任何内容.任何有助于使其在测试模式下工作或确定问题根源的帮助将不胜感激.

ala*_*lav 5

想出来,希望这可以帮助别人.

作为play2.4和specs2的新手,我没有意识到默认情况下的测试是在没有任何应用程序上下文的情况下运行的.但是我注意到,运行时in new WithApplication使用默认的applicationloader加载它们.

我的问题的一个快速解决方法是使用非常相似的WithApplicationLoader:

in new WithApplicationLoader(new CustomApplicationLoader)
Run Code Online (Sandbox Code Playgroud)

我最后编写了一个自定义上下文提供程序,将它们捆绑在一起因为我认为它更清洁一点:

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))
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

以下是使用它的示例:

"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"
  }
}
Run Code Online (Sandbox Code Playgroud)

application.test.conf正如我所希望的那样正确加载.这对于任何特定于测试的配置都很有用,并且对于测试(h2:在内存中)和dev(jdbc:mysql)具有单独的db配置非常方便.