Akka TestProbe测试context.watch()/终止处理

时间:2014-05-30 04:02:59

标签: akka

我正在使用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继续发送消息而不是停止消息。

我现在遇到过几次,如果演员正确处理上述情况,测试的正确方法是什么?

1 个答案:

答案 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)