gpt4 book ai didi

Scala Play 框架 - 运行涉及 Akka 的测试时出现 "cannot enqueue after timer shutdown"错误

转载 作者:行者123 更新时间:2023-12-01 05:03:22 24 4
gpt4 key购买 nike

在尝试对运行 Akka 调度程序的代码(使用 Mockito)进行单元测试时,我不断收到“计时器关闭后无法入队”的消息。

我的代码:

Global.scala

override def onStart(app: Application){
Some(Akka.system.scheduler.schedule(23.hours, 24.hours) {
println("I run all the time")
})
}

TasksRepositorySpec.scala
def insertTestData() = {
running(FakeApplication()) {
//some code
}
}

当我运行时:
activator test

我得到:
[info] TasksRepositorySpec
[info]
[error] !
[error] cannot enqueue after timer shutdown (Scheduler.scala:270)
[error] akka.actor.LightArrayRevolverScheduler.schedule(Scheduler.scala:270)
[error] akka.actor.Scheduler$class.schedule(Scheduler.scala:79)
[error] akka.actor.LightArrayRevolverScheduler.schedule(Scheduler.scala:182)
[error] Global$.onStart(Global.scala:56)
[error] play.api.GlobalPlugin.onStart(GlobalSettings.scala:272)
[error] play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:91)
[error] play.api.Play$$anonfun$start$1$$anonfun$apply$mcV$sp$1.apply(Play.scala:91)
[error] play.api.Plugins.foreach(Plugins.scala:57)
[error] play.api.Play$$anonfun$start$1.apply$mcV$sp(Play.scala:91)
[error] play.api.Play$$anonfun$start$1.apply(Play.scala:91)
[error] play.api.Play$$anonfun$start$1.apply(Play.scala:91)
[error] play.utils.Threads$.withContextClassLoader(Threads.scala:21)
[error] play.api.Play$.start(Play.scala:90)
[error] play.api.test.PlayRunners$class.running(Helpers.scala:41)
[error] play.api.test.Helpers$.running(Helpers.scala:363)
[error] repositories.TasksRepositorySpec.insertData(TasksRepositorySpec.scala:69)
[error] repositories.TasksRepositorySpec$$anonfun$2.apply$mcI$sp(TasksRepositorySpec.scala:88)
[error] repositories.TasksRepositorySpec$$anonfun$2.apply(TasksRepositorySpec.scala:88)
[error] repositories.TasksRepositorySpec$$anonfun$2.apply(TasksRepositorySpec.scala:88)

我使用 Play 2.4

任何帮助将不胜感激

最佳答案

抱歉,我没有找到解决方案,而只是一种解决方法。它包括使用假冒 Global测试对象,其中 onStart()onStop()方法为空。

首先你需要拆分你的Global将对象转换为 trait 和空对象:

Global.scala

object Global extends Global

trait Global extends GlobalSettings { ... }

然后在你的测试代码中,你可以创建一个假 Global :

Fake.scala
object FakeGlobal extends Global {
override def onStart(app: Application): Unit = {}
override def onStop(app: Application): Unit = {}
}

object Fake {
// This has to be a method, cannot be a value
def application() = FakeApplication(withGlobal = Some(FakeGlobal))
}

最后在你的测试中使用它:

TasksRepositorySpec.scala
def insertTestData() = {
running(Fake.application()) {
//some code
}
}

这个对我有用。希望能帮助到你!

关于Scala Play 框架 - 运行涉及 Akka 的测试时出现 "cannot enqueue after timer shutdown"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31229622/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com