借助akka-testkit测试延迟的消息

时间:2018-06-27 05:50:43

标签: scala akka scalatest akka-testkit

有两个参与者-ProducerActorConsumerActor。生产者具有一个调度程序,该调度程序向每个"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")
}

是否可以测试消费者参与者每个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")
       }

    }
}

但是,如果有更好的解决方案来完成此任务,那么可以共享。

0 个答案:

没有答案