2017-03-07 49 views
0

這是關於Play 2.3應用程序,我試圖將Guice引入。 我有以下的遺留代碼Guicify和我走到這一步注入彈性數據庫服務的Play應用程序

class DatabaseService { 
    def db: Database = DB(play.api.Play.current) 
    //More code below. 
} 

該類在被測類注射,說com.TestA。 當我使用修改的OneAppPerTest安裝程序運行測試用例時,我看到以下類型的ProvisionExceptions。

Error injecting constructor, java.lang.RuntimeException: There is no started application 

是因爲使用了play.api.Play.current? 我該如何解決這個問題?

附加信息 重寫的OneAppPerTest變型中,使用以下邏輯

override def newAppForTest(testData: TestData): FakeApplication = { 
    new FakeApplication(
     additionalConfiguration = additionalConfiguration, 
     withGlobal = Some(globalSettings) 
    ) 
} 

其中additionalConfiguration可以通過實際測試和globalSettings重寫是其中吉斯在框架

protected def globalSettings = { 
    new TestGlobalSettings { 
     val injector = Guice.createInjector(overriddenModules: _*) 

     override def getControllerInstance[A](controllerClass: Class[A]): A = { 
     injector.getInstance(controllerClass) 
     } 

     override def getInjector = { 
     injector 
     } 
    } 
    } 

內引入還有其他的測試案例具有類似的設置,可以很好地工作。我能夠注入模擬,測試類。但是,使用此DatabaseService類的每個測試都失敗,因爲我無法乾淨地注入它。

+0

如果'DatabaseService'被注入,爲什麼不注入'DB'呢? – rethab

+0

不過要試一試。我假設這需要'Application'注入。然而,結果卻是一個隱含的參數。我會嘗試你提到的並回復你。 – Serendipity

+0

@rethab DB不是注入式屬性。它更多的是創建數據庫的方法。數據庫不容易注入,因爲它沒有無參數的構造函數。 – Serendipity

回答

0

該問題與Guice如何創建對象以及何時相關。這裏的DatabaseService可以訪問當前的應用程序,即當前的配置。然而,在我的Global.scala中,我在「onStart」被實際調用之前注入了它。 這意味着我們試圖在正確初始化之前訪問應用程序。

在測試類lazy中進行DatabaseService注入有助於避免該錯誤。

相關問題