Есть два актера - ProducerActor
и ConsumerActor
. В Producer есть планировщик, который отправляет себе сообщение "Tick"
каждый 2000 ms
. После этого производитель отправляет потребителю сообщение "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")
}
Можно ли проверить случай, когда субъект-потребитель получает сообщение "Hello" каждый раз 2000 ms
? Таким образом, если сообщение получено в период < 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")
}
}
}
Но если есть лучшее решение для этой задачи, было бы здорово, если бы вы могли поделиться.