考虑以下演员:
class Stateful(worker: ActorRef) extends Actor {
val queue = // immutable queue with details
def receive = {
case NewJob(details) => worker ! details
case JobRejection(details) if sender == worker => // enqueue
case JobRequest if sender == worker => // dequeue and send to worker
}
}
这个简单的演员将所有作业转发给其底层工作者。如果工人太忙,他就会拒绝这份工作,这项工作将在以后入队。在某些时候,工作人员已完成并从队列中请求另一个工作,依此类推。
为了测试这个actor,我正在传递一个拒绝第一个作业的假工作者,所以我可以测试它是否实际上在队列中(这里有一条GetJobs
消息,队列是不可变的所以不用担心)。在我的工作被拒绝后scheduleOnce
发送JobRequest
delay
100 millis
。
现在我从我的测试套件发送作业,稍等一下使用scheduleOnce
技术并发送GetJobs消息。如果我很幸运,这份工作就在队列中。我重复这个过程,这次队列应该再次为空。有时它是。
有更好的方法来控制时间吗?因为基本上有三个延迟,我手动调整。并且没有任何保证,在添加另外几个这样的测试之后,这种调整将在不同的机器上工作,甚至在我的机器上工作。
答案 0 :(得分:1)
使用TestProbe而不是假工作者。然后,您可以在探针上使用标准的TestKit方法,并让探针将消息发送回Stateful
actor。
请参阅参考手册中的section on using Probes。