在ScalaTest上运行Scala Play Slick RejectedExecutionException

时间:2015-10-19 20:26:35

标签: scala playframework dependency-injection slick scalatest

我的FlatSpec测试正在抛出:

 java.util.concurrent.RejectedExecutionException: Task slick.backend.DatabaseComponent$DatabaseDef$$anon$2@dda460e rejected from java.util.concurrent.ThreadPoolExecutor@4f489ebd[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 2]

但只有当我运行多个套件时,才能在第二个套件前进;似乎在测试之间没有重置的东西。我正在使用OneAppPerSuite来提供应用上下文。每当我使用OneAppPerTest时,它会在第一次测试/套件后再次失败。

我设置override def beforeEach = tables.foreach ( _.truncate )以清除表格,其中truncate只删除表格中的所有内容:Await.result (db.run (q.delete), Timeout.Inf)

我的DAO图层有以下设置:

SomeMappedDaoClass extends SomeCrudBase with HasDatabaseConfig

其中

trait SomeCrudBase { self: HasDatabaseConfig => 
  override lazy val dbConfig = DatabaseConfigProvider.get[JdbcProfile](Play.current)
  implicit lazy val context = Akka.system.dispatchers.lookup("db-context")
}

并在application.conf

db-context {
  fork-join-executor {
    parallelism-factor = 5
    parallelism-max = 100
  }
}

我正在重构代码以摆脱Play的Guice DI。以前,当它有@Inject() (val dbConfigProvider: DatabaseConfigProvider)和扩展HasDatabaseConfigProvider而不是DAO类时,一切都很完美。现在它没有,我不知道为什么。

提前谢谢!

2 个答案:

答案 0 :(得分:1)

感兴趣的是SomeMappedDaoClassobject? (我知道它上课但是......)。

在测试Play框架时,我在处理设置与Play框架部分连接的object时遇到过这种问题。

在测试之间和测试文件之间,Play app被终止并重新启动,但是object创建的持久化(因为它们是object,它们在JVM中初始化一次背景 - 我认为)。

这可能导致object具有连接(对于光滑,演员,任何......)的连接,该连接引用测试中使用的app的第一个实例。当app终止并且新测试开始新的app时,该连接现在指向任何内容。

答案 1 :(得分:0)

我遇到了同样的问题,就我而言,上述答案没有成功。 我的解决方案 -

implicit val app = new FakeApplication(additionalConfiguration = inMemoryDatabase())
Play.start(app)

在第一个测试用例中添加以上代码,不要添加Play.stop(app)。由于所有测试用例都已引用第一个应用程序,因此不应终止它。这对我有用。