测试时池已关闭(HikariDataSource)

Posted

技术标签:

【中文标题】测试时池已关闭(HikariDataSource)【英文标题】:Pool has been Shutdown (HikariDataSource) when testing 【发布时间】:2015-07-10 08:16:51 【问题描述】:

将应用程序迁移到 Play 2.4 并在应用程序的控制器中引入依赖注入后,运行单元测试时出现“池已关闭”。受影响的测试是这样的:

@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


很明显,我缺少一些东西来启动和运行数据库以进行测试,但我不确定是什么。

【问题讨论】:

【参考方案1】:

解决了这个问题。

尝试用 def 替换惰性 val,如以下问题中所回答:Testing: FakeApplication ignoring additionalConfiguration

这解决了问题。

如果有人能解释为什么会很高兴?

【讨论】:

您希望每个规范都有一个新应用程序,这就是您通过def 获得的。使用惰性 val,相同的应用程序实例会在测试中持续存在,导致在其生命周期完成并且其组件(例如 Hikari)关闭后尝试使用它。【参考方案2】:

这个问题困扰着我,因为我在代码中坚持应用程序状态。由于测试通常每个都有自己的FakeApplication,因此当在另一个FakeApplication 实例的上下文中使用时,来自一个FakeApplication 实例的隐藏状态会导致问题。一个具体的例子是play.api.Play.current - 这需要为每个FakeApplication 实例重新评估,并且不应在您的代码中保留(仅在评估一次之后)。

【讨论】:

以上是关于测试时池已关闭(HikariDataSource)的主要内容,如果未能解决你的问题,请参考以下文章

Java 异常 java.sql.SQLException: HikariDataSource HikariDataSource (HikariPool-1) 已关闭

MySQL 调用 connection.end() => 后无法打开连接 => 错误:池已关闭

springboot单元测试自动回滚:@Transactional

通用连接池已存在错误 (Oracle UCP)

HikariPool-1 - Connection is not available, request timed out after XXXXms.

连接池已满,超过最大连接数 解决方案