Тестирование отложенных сообщений с помощью akka-testkit - PullRequest
0 голосов
/ 27 июня 2018

Есть два актера - 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")
       }

    }
}

Но если есть лучшее решение для этой задачи, было бы здорово, если бы вы могли поделиться.

...