Scala播放框架-获取“;计时器关闭后无法排队“;运行涉及Akka的测试时出错

Scala播放框架-获取“;计时器关闭后无法排队“;运行涉及Akka的测试时出错,scala,playframework,akka,mockito,playframework-2.4,Scala,Playframework,Akka,Mockito,Playframework 2.4,当尝试对运行Akka调度程序的代码(使用Mockito)进行单元测试时,我总是得到“计时器关闭后无法排队” 我的代码: Global.scala override def onStart(app: Application){ Some(Akka.system.scheduler.schedule(23.hours, 24.hours) { println("I run all the time") }) } def insertTestData() = {

当尝试对运行Akka调度程序的代码(使用Mockito)进行单元测试时,我总是得到“计时器关闭后无法排队”

我的代码:

Global.scala

override def onStart(app: Application){
    Some(Akka.system.scheduler.schedule(23.hours, 24.hours) {
         println("I run all the time")
    })
}
def insertTestData() = {
    running(FakeApplication()) {
       //some code
    }
}
object Global extends Global

trait Global extends GlobalSettings { ... }
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))
}
def insertTestData() = {
  running(Fake.application()) {
    //some code
  }
}
任务存储规范scala

override def onStart(app: Application){
    Some(Akka.system.scheduler.schedule(23.hours, 24.hours) {
         println("I run all the time")
    })
}
def insertTestData() = {
    running(FakeApplication()) {
       //some code
    }
}
object Global extends Global

trait Global extends GlobalSettings { ... }
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))
}
def insertTestData() = {
  running(Fake.application()) {
    //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


任何帮助都将不胜感激

很抱歉,我没有找到解决方案,只是找到了一个解决办法。它包括在
onStart()
onStop()
方法为空的测试中使用假
Global
对象

首先,您需要将
Global
对象拆分为trait和空对象:

Global.scala

override def onStart(app: Application){
    Some(Akka.system.scheduler.schedule(23.hours, 24.hours) {
         println("I run all the time")
    })
}
def insertTestData() = {
    running(FakeApplication()) {
       //some code
    }
}
object Global extends Global

trait Global extends GlobalSettings { ... }
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))
}
def insertTestData() = {
  running(Fake.application()) {
    //some code
  }
}
然后在测试代码中,您可以创建一个假的
全局

假。scala

override def onStart(app: Application){
    Some(Akka.system.scheduler.schedule(23.hours, 24.hours) {
         println("I run all the time")
    })
}
def insertTestData() = {
    running(FakeApplication()) {
       //some code
    }
}
object Global extends Global

trait Global extends GlobalSettings { ... }
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))
}
def insertTestData() = {
  running(Fake.application()) {
    //some code
  }
}
最后在测试中使用它:

任务存储规范scala

override def onStart(app: Application){
    Some(Akka.system.scheduler.schedule(23.hours, 24.hours) {
         println("I run all the time")
    })
}
def insertTestData() = {
    running(FakeApplication()) {
       //some code
    }
}
object Global extends Global

trait Global extends GlobalSettings { ... }
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))
}
def insertTestData() = {
  running(Fake.application()) {
    //some code
  }
}

它对我有用。希望有帮助

在游戏2.3中也有同样的问题,我实际上使用了游戏2.4