有两个演员- ProducerActor和ConsumerActor。生产者有一个调度程序,它向自己发送"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")
}
}
}但是,如果有一个更好的解决方案,这将是伟大的,如果你可以分享。
发布于 2022-10-12 09:22:15
您可以使用时间安排会议来完成这一任务。
某些事件不能立即发生(如计时器),其他事件必须在最后期限之前发生。因此,所有检查方法都必须在阳性或阴性结果范围内接受上限。
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
}给定给is的块必须在一个介于min到最大值之间的持续时间之后完成,其中前者默认为零。
https://stackoverflow.com/questions/51055371
复制相似问题