【问题标题】:Akka TestProbe to test context.watch() / Terminated handlingAkka TestProbe 测试 context.watch() / 终止处理
【发布时间】:2014-05-30 04:02:59
【问题描述】:

我正在使用 TestKit 测试一个 akka 系统。我正在测试的系统的一个参与者,在收到某种消息类型时,context.watches 发送者,并在发送者死亡时杀死自己:

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)

现在,要测试 watch / Terminated 行为 - 我想模拟被杀死的 testprobe。

我可以的

probe.send(target, Terminated)

但是,这假定目标调用了 context.watch(sender) ,否则它不会收到 Terminated。

我可以的

probe.testActor ! Kill

with 不会发送 Terminated 除非目标已正确调用 context.watch(sender) ,但我实际上并不希望测试探针被杀死,因为它需要保持响应以测试(例如)目标是否继续发送消息停止自己。

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

【问题讨论】:

    标签: akka


    【解决方案1】:

    您可以使用单独的探针来观察被测参与者是否终止,而不是尝试通过“发送者”探针来执行此操作:

    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)
    

    【讨论】:

    • 我遇到了同样的问题,但在 C# 中使用 Akka.Net。这种方法也解决了我的问题。
    猜你喜欢
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 2019-09-24
    • 2016-10-08
    • 2021-12-27
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    相关资源
    最近更新 更多