在 akka-testkit 的帮助下测试延迟的消息



有两个演员 -ProducerActorConsumerActor。生产者有一个调度程序,它每2000 ms向自己发送"Tick"消息。之后,生产者向消费者发送"Hello"消息:

class ProducerActor(consumer: ActorRef) extends Actor {
override def receive: Receive = {
case "Tick" =>
...
// some code which takes < 1 ms
...
consumer ! "Hello"
}
override def preStart: Unit = 
context.system
.scheduler
.schedule(2000 milliseconds, 2000 milliseconds, self, "Tick")
}

是否可以测试消费者参与者每次2000 ms收到"Hello"消息的情况?因此,如果在时间段< 2000 ms> 2000 ms内收到消息,则测试将断言错误。

例如:

"Consumer test" should {
"receive message each 2000 ms" in {
...
val consumer = TestProbe()
val producer = system.actorOf(Props(new ProducerActor(consumer.ref))
...
consumer.howToExpectDelayedMessage(minDelay = 2000 millis, "Hello")
}
}

--- UPD ---

我已经找到了以下适合我的解决方案:

"Consumer test" should {
"receive message each 2000 ms" in {
val consumer = TestProbe()
val producer = system.actorOf(Props(new ProducerActor(consumer.ref))
// check the first ten periods
(0 to 10) foreach { _ =>
consumer.expectNoMsg(2000 millis)
consumer.expectMsg("Hello")
}
}
}

但是,如果这项任务有更好的解决方案,如果您可以分享,那就太好了。

您可以使用时序调用来执行此操作。

某些事件不能立即发生(如计时器(,其他事件需要在截止日期之前发生。因此,所有检查方法都接受上限内必须获得阳性或阴性结果。

import akka.actor.Props
import scala.concurrent.duration._
val worker = system.actorOf(Props[Worker]())
within(200 millis) {
worker ! "some work"
expectMsg("some result")
expectNoMessage() // will block for the rest of the 200ms
Thread.sleep(300) // will NOT make this block fail
}

给定的块必须在介于最小值和最大值之间的持续时间后完成,其中前者默认为零。

相关内容

  • 没有找到相关文章

最新更新