gpt4 book ai didi

scala - 在 akka 中测试定时器事件

转载 作者:行者123 更新时间:2023-11-28 19:46:03 24 4
gpt4 key购买 nike

我有一个函数,它使用 scheduleOnce 来安排一个事件在未来某个时间发生,我想编写一个测试来检查:

  • 事件确实安排好了
  • 安排在正确的时间
  • 当该事件最终触发时,系统的行为符合预期

但我不希望测试实际上等待几分钟什么都不做。

我应该如何最好地测试使用 akka 调度程序的代码?

最佳答案

这是@lmm 描述的模拟调度程序的示例。在此示例中,我们真正将 Action 的完整调度和处理作为两个独立的场景进行测试。给定某些条件的第一个测试(在我的示例中接收到某种类型的消息)我们将安排一个回调,第二个是处理在该计时器关闭时返回给自身的消息。代码如下:

object TimerExampleActor{
case object ClearState
case class ScheduleStateClearing(duration:FiniteDuration)
}

class TimerExampleActor extends Actor{
import TimerExampleActor._

var state:List[Int] = Nil

def receive = {
case ScheduleStateClearing(d) =>
scheduler.scheduleOnce(d, self, ClearState)(context.dispatcher)

case ClearState =>
state = Nil
}

def scheduler = context.system.scheduler
}

然后,使用specs2和mockito,我的测试用例如下:

class TimerExampleActorTest extends Specification with Mockito with NoTimeConversions{
import TimerExampleActor._
implicit val system = ActorSystem("test")

trait testscope extends Scope{
val mockScheduler = mock[Scheduler]
val actor = TestActorRef(new TimerExampleActor{
override def scheduler = mockScheduler
})
}

"A request to schedule state clearing" should{
"schedule a callback for the message ClearState to self with the supplied duration" in new testscope{
val dur = 1.minute
actor ! ScheduleStateClearing(dur)
there was one(mockScheduler).scheduleOnce(dur, actor, ClearState)(actor.underlyingActor.context.dispatcher)
}
}

"A ClearState message received by the actor" should{
"clear the interval 'state' List" in new testscope{
actor.underlyingActor.state = List(1,2,3)
actor ! ClearState
actor.underlyingActor.state mustEqual Nil
}
}
}

您可以看到,当我创建被测 actor 实例时,我覆盖了我创建的方法来获取调度程序的实例,从而允许我返回一个模拟。这不是进行此类测试的唯一方法,但它肯定是您可以考虑的一种选择。

关于scala - 在 akka 中测试定时器事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26920241/

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