2015-07-10 312 views
2

將應用程序遷移到Play 2.4並將依賴注入引入到應用程序的控制器後,運行單元測試時出現「池已關閉」。受影響的測試是這樣的:池在測試時已關閉(HikariDataSource)

@RunWith(classOf[JUnitRunner]) 

class ApplicationSpec extends Specification { 
    "Application" should { 
    "doSomething" in running(TestUtil.app) { 
     val myId = IdGen.newId("someone") 
     ... 
    } 
    } 

} 

凡IdGen類看起來是這樣的:

object IdGen { 

    def newId(name: String): ClientCredentials = { 
    DB.withTransaction("myDb") { implicit conn => 
     ... 
    } 
    } 

} 

測試失敗的DB.withTransaction()與

[error] Pool has been shutdown (HikariDataSource.java:89) 
[error] com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:89) 
[error] play.api.db.DefaultDatabase.getConnection(Databases.scala:143) 
[error] play.api.db.DefaultDatabase.withConnection(Databases.scala:153) 
[error] play.api.db.DefaultDatabase.withTransaction(Databases.scala:162) 
[error] play.api.db.DB$.withTransaction(DB.scala:72) 
[error] com.example.idGen$.newId... 

我打電話初始化TestUtil.app與

object TestUtil { 

    lazy val app = new GuiceApplicationBuilder() 
     .configure(defaultConfig ++ Helpers.inMemoryDatabase("myDB")) 
     .bindings(new TestModule) // Mock injections for test 
     .build 

} 

很明顯,我錯過了一些可以讓數據庫啓動並運行測試的東西,但我不確定是什麼。

回答

0

解決了這個問題。

試圖用高清來替代懶惰VAL,在這個問題回答說:Testing: FakeApplication ignoring additionalConfiguration

這解決了這個問題。

如果有人能解釋爲什麼會愛?

+1

您需要爲每個規格指定一個新的應用程序,這是您使用「def」獲得的。使用懶惰的val時,相同的應用程序實例在測試中持續存在,導致嘗試在其生命週期完成並且其組件(例如Hikari)關閉後嘗試使用它。 – Mikesname

0

這個問題咬我,因爲我在代碼中堅持應用程序狀態。由於測試通常各自得到自己的FakeApplication,在一個FakeApplication實例的背景下使用時,從一個FakeApplication實例轉過來的狀態會導致問題。一個具體的例子是play.api.Play.current - 這需要重新評估每個FakeApplication實例,並且不應該在您的代碼中進行(僅在評估一次後)。