2016-02-10 59 views
3

我想爲每種模式(Dev,Prod,Test)加載不同的配置文件,所以我寫了以下內容。Play Framework 2.4.1:在測試模式下忽略play.application.loader設置

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" 

這工作完全正式版和開發模式,而不是在測試模式。在測試模式下,Logger.info(「CUSTOMBUILDER」)從不被觸發。

我似乎無法在文檔中找到任何關於爲什麼在測試模式下無法使用的問題。任何幫助,以獲得此測試模式下工作或確定問題的來源將不勝感激。

+0

你能否也請在這裏發佈測試代碼? – marcospereira

回答

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)有單獨的數據庫配置非常方便。