我的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类时,一切都很完美。现在它没有,我不知道为什么。
提前谢谢!
答案 0 :(得分:1)
感兴趣的是SomeMappedDaoClass
和object
? (我知道它上课但是......)。
在测试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)。由于所有测试用例都已引用第一个应用程序,因此不应终止它。这对我有用。