我正在使用TestKit测试akka系统。系统的一个参与者在接收到某种消息类型后进行测试,context.watch
发送者,并在发送者死亡时自行终止:
trait Handler extends Actor {
override def receive: Receive = {
case Init => context.watch(sender)
case Terminated => context.stop(self)
}
}
在我的测试中我发送
val probe = TestProbe(system)
val target = TestActorRef(Props(classOf[Handler]))
probe.send(target, Init)
现在,要测试监视/终止行为 - 我想模拟被杀死的testprobe。
我能做到
probe.send(target, Terminated)
但是,这预先假定目标已调用context.watch(sender)
,否则它将不会收到终止。
我能做到
probe.testActor ! Kill
除非目标已正确调用Terminated
,否则不会发送context.watch(sender)
,但我实际上并不希望testprobe被杀死,因为它需要保持对测试的响应if(for例如)target继续发送消息而不是停止消息。
我现在遇到过几次,如果演员正确处理上述情况,测试的正确方法是什么?
答案 0 :(得分:4)
你可以通过一个单独的探测器观看被测试的演员终止,而不是试图通过发送者'探针:
val probe = TestProbe(system)
val deathWatcher = TestProbe(system)
val target = TestActorRef(Props(classOf[Handler]))
deathWatcher.watch(target)
probe.send(target, Init)
// TODO make sure the message is processed.. perhaps ack it?
probe ! Kill
deathWatcher.expectTerminated(target)