在以下守则中:
TestKit probe = new TestKit(system); // line 1
ActorRef deviceActor = system.actorOf(Device.props("group", "device")); // line 2
deviceActor.tell(new DeviceManager.RequestTrackDevice("group", "device"), probe.getRef()); // line 3
probe.expectMsgClass(DeviceManager.DeviceRegistered.class); // line 4
assertEquals(deviceActor, probe.getLastSender()); // line 5如果我注释掉第4行,测试就失败了。第3行足够向参与者发送消息。那么第4行到底在做什么呢?
发布于 2018-03-02 14:27:26
为了了解发生了什么,让我们检查一下源代码。
以下是getLastSender()的定义,其中p是TestProbe
public ActorRef getLastSender() {
return p.lastMessage().sender();
}lastMessage在TestKit.scala中声明为
private[akka] var lastMessage: Message = NullMessagelastMessage变量在两种方法之一receiveWhile和receiveOne中发生突变。expectMsgClass方法调用后者:
def expectMsgClass[C](max: FiniteDuration, c: Class[C]): C = expectMsgClass_internal(max.dilated, c)
private def expectMsgClass_internal[C](max: FiniteDuration, c: Class[C]): C = {
val o = receiveOne(max)
// ...
}基本上,如果您在测试中不调用TestKit的内置断言之一(例如,expectMsg*方法之一),那么lastMessage将保持不变为NullMessage。如果lastMessage是NullMessage,那么调用lastMessage.sender将导致异常,而测试中的assertEquals(deviceActor, probe.getLastSender());将失败。
另一方面,如果您确实调用了一个内置断言(如expectMsgClass ),那么lastMessage将被适当地设置,并且lastMessage的发送方将正确解析。
简而言之,调用getLastSender()假定使用TestKit断言。这在文档 (强调雷)中是隐含的:
探针存储最后一脱队列消息(,即在其接收之后)的发送方,该消息可以使用
getLastSender()方法检索。
https://stackoverflow.com/questions/49067455
复制相似问题