將應用程序遷移到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
}
很明顯,我錯過了一些可以讓數據庫啓動並運行測試的東西,但我不確定是什麼。
您需要爲每個規格指定一個新的應用程序,這是您使用「def」獲得的。使用懶惰的val時,相同的應用程序實例在測試中持續存在,導致嘗試在其生命週期完成並且其組件(例如Hikari)關閉後嘗試使用它。 – Mikesname