2

在将应用程序迁移到 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 类看起来像这样:

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

}

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

4

2 回答 2

0

解决了这个问题。

尝试用 def 替换惰性 val,如以下问题所述:测试:FakeApplication ignoring additionalConfiguration

这解决了这个问题。

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

于 2015-07-10T08:21:10.680 回答
0

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

于 2015-07-24T22:20:13.567 回答