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

Posted

技术标签:

【中文标题】Play Framework 2.4.1:在测试模式下忽略 play.application.loader 设置【英文标题】:Play Framework 2.4.1: play.application.loader setting ignored in Test mode 【发布时间】:2016-02-10 22:50:59 【问题描述】:

我想为每种模式(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 模式下完美运行,但在 Test 模式下却不行。在测试模式下,永远不会触发 Logger.info("CUSTOMBUILDER")。

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

【问题讨论】:

你能把测试代码也贴在这里吗? 【参考方案1】:

想通了,希望这对某人有所帮助。

作为 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。这对于任何特定于测试的配置都非常有用,并且对于为 test (h2:in memory) 和 dev (jdbc:mysql) 进行单独的 db 配置非常方便。

【讨论】:

以上是关于Play Framework 2.4.1:在测试模式下忽略 play.application.loader 设置的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework 2.4.1:如何从 JsArray 中移除元素

测试期间可以在 Play Framework 中启用 HTTPS 侦听吗?

如何在 Play Framework 2 中测试数据库演化

Play framework & CAS - 如何登录功能测试?

如何在 Play Framework 2.0 (Scala) 中插入测试数据?

启动自动测试时 Play Framework 中的配置日志记录