【发布时间】:2016-03-05 18:44:26
【问题描述】:
我正在写一个Actor,它应该关注另一个Actor;我们称后者为target。我的Actor 应该在其目标停止后自行停止。对于这个目标,我只有一个ActorSelection。要观看它,我显然需要ActorRef,所以我想我应该发送ActorSelection 和Identify 消息;当它回复ActorIdentity 时,我会得到它的ActorRef。到目前为止一切顺利,但我无法让它工作。
这是规格:
// Arrange
val probe = TestProbe()
val target = TestProbe().ref
val sut = system.actorOf(MyActor.props(system.actorSelection(target.path)), "watch-target")
probe watch sut
// Act
target ! PoisonPill
// Assert
probe.expectTerminated(sut)
以及实现(FSM,细节略过):
log.debug("Asking target selection {} to identify itself; messageId={}", selection.toString(), messageId)
selection ! Identify(messageId)
when(Waiting) {
case Event(ActorIdentity(`messageId`, Some(ref)), Queue(q)) =>
log.info("Received identity for remote target: {}", ref)
context.watch(ref)
goto(NextState) using TargetFound(ref)
case Event(ActorIdentity(`messageId`, None), Queue(q)) =>
log.error("Could not find requested target {}", selection.toString())
stop()
}
initialize()
现在,当我运行测试时,它是绿色的,因为被测系统确实已停止。但问题是它会自行停止,因为使用上述步骤无法找到目标。日志文件说:
要求目标选择 ActorSelection[Anchor(akka://default/), Path(/system/testProbe-3)] 来识别自己; messageId=871823258
找不到请求的目标 ActorSelection[Anchor(akka://default/), Path(/system/testProbe-3)]
我在这里遗漏了一些明显的东西吗?也许TestProbe 不应该透露其真实身份?我什至尝试将虚拟 Actor 实例化为 target,但结果是相同的。有什么线索吗?
【问题讨论】:
标签: scala akka akka-testkit