测试时池已关闭(HikariDataSource)
Pool has been Shutdown (HikariDataSource) when testing
将应用程序迁移到 Play 2.4 并将依赖注入引入应用程序的控制器后,我在 运行 单元测试时得到 "Pool has been Shutdown"。受影响的测试是这样的:
@RunWith(classOf[JUnitRunner])
class ApplicationSpec extends Specification {
"Application" should {
"doSomething" in running(TestUtil.app) {
val myId = IdGen.newId("someone")
...
}
}
}
IdGen class 看起来像:
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 替换 lazy val,如这个问题中的回答:Testing: FakeApplication ignoring additionalConfiguration
问题解决了。
如果有人能解释原因,我会很高兴吗?
这个问题困扰着我,因为我在代码中坚持应用程序状态。由于测试通常每个都获得自己的 FakeApplication
,来自一个 FakeApplication
实例的 squireled-away 状态,当在另一个 FakeApplication
实例的上下文中使用时,会导致问题。一个具体的例子是 play.api.Play.current
- 这需要为每个 FakeApplication
实例重新评估,并且不应在您的代码中保留(仅评估一次后)。
将应用程序迁移到 Play 2.4 并将依赖注入引入应用程序的控制器后,我在 运行 单元测试时得到 "Pool has been Shutdown"。受影响的测试是这样的:
@RunWith(classOf[JUnitRunner])
class ApplicationSpec extends Specification {
"Application" should {
"doSomething" in running(TestUtil.app) {
val myId = IdGen.newId("someone")
...
}
}
}
IdGen class 看起来像:
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.appobject TestUtil {
lazy val app = new GuiceApplicationBuilder()
.configure(defaultConfig ++ Helpers.inMemoryDatabase("myDB"))
.bindings(new TestModule) // Mock injections for test
.build
}
显然,我缺少启动数据库和 运行 进行测试的东西,但我不确定是什么。
解决了这个问题。
尝试用 def 替换 lazy val,如这个问题中的回答:Testing: FakeApplication ignoring additionalConfiguration
问题解决了。
如果有人能解释原因,我会很高兴吗?
这个问题困扰着我,因为我在代码中坚持应用程序状态。由于测试通常每个都获得自己的 FakeApplication
,来自一个 FakeApplication
实例的 squireled-away 状态,当在另一个 FakeApplication
实例的上下文中使用时,会导致问题。一个具体的例子是 play.api.Play.current
- 这需要为每个 FakeApplication
实例重新评估,并且不应在您的代码中保留(仅评估一次后)。