首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阿克卡的TestKit.expectMsgClass

阿克卡的TestKit.expectMsgClass
EN

Stack Overflow用户
提问于 2018-03-02 10:40:46
回答 1查看 294关注 0票数 1

在以下守则中:

代码语言:javascript
复制
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行到底在做什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-02 14:27:26

为了了解发生了什么,让我们检查一下源代码。

以下是getLastSender()的定义,其中pTestProbe

代码语言:javascript
复制
public ActorRef getLastSender() {
  return p.lastMessage().sender();
}

lastMessageTestKit.scala中声明为

代码语言:javascript
复制
private[akka] var lastMessage: Message = NullMessage

lastMessage变量在两种方法之一receiveWhilereceiveOne中发生突变。expectMsgClass方法调用后者:

代码语言:javascript
复制
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。如果lastMessageNullMessage,那么调用lastMessage.sender将导致异常,而测试中的assertEquals(deviceActor, probe.getLastSender());将失败。

另一方面,如果您确实调用了一个内置断言(如expectMsgClass ),那么lastMessage将被适当地设置,并且lastMessage的发送方将正确解析。

简而言之,调用getLastSender()假定使用TestKit断言。这在文档 (强调雷)中是隐含的:

探针存储最后一脱队列消息(,即在其接收之后)的发送方,该消息可以使用getLastSender()方法检索。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49067455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档