【问题标题】:Assert order of messages received using Akka TestProbe断言使用 Akka TestProbe 接收到的消息的顺序
【发布时间】:2014-08-14 20:01:41
【问题描述】:

我们正在为其编写单元测试的参与者,作为测试的一部分,我们希望断言某些消息以特定顺序发送给另一个参与者。在我们的单元测试中,接收消息的 Actor 由 Akka TestProbe 表示,它在创建时被注入到被测 Actor 中。

断言消息已发送到测试探针没有问题,但是我们一直在努力寻找一种方法来断言它们以正确的顺序发送(我们在documentation)。任何想法我们如何实现这一目标?

以下是突出问题的最小实现。

实施

case class Message(message: String)
case class ForwardedMessage(message: String)

class ForwardingActor(forwardTo: ActorRef) extends Actor {
  def receive = {
    case Message(message) =>
      forwardTo ! ForwardedMessage(message)
  }
}

单元测试

class ForwardMessagesInOrderTest extends TestKit(ActorSystem("testSystem"))
                                 with WordSpecLike
                                 with MustMatchers {

  "A forwarding actor" must {
    val forwardingReceiver = TestProbe()
    val forwardingActor = system.actorOf(Props(new ForwardingActor(forwardingReceiver.ref)))

    "forward messages in the order they are received" in {
      forwardingActor ! Message("First message")
      forwardingActor ! Message("Second message")

      // This is the closest way we have found of achieving what we are looking for, it asserts
      // that both messages were received, but doesn't assert correct order. The test will pass
      // regardless which way round we put the messages below.
      forwardingReceiver.expectMsgAllOf(
          ForwardedMessage("Second message"),
          ForwardedMessage("First message"))
    }
  }
}

【问题讨论】:

    标签: scala unit-testing akka actor


    【解决方案1】:

    我将建议对您的测试规范进行两项更改。首先,在创建被测actor时,使用TestActorRef,如下所示:

    val forwardingActor = TestActorRef(new ForwardingActor(forwardingReceiver.ref))
    

    使用TestActorRef 将确保使用CallingThreadDispatcher,从而消除测试异步代码(参与者是)的任何复杂性。完成此操作后,您可以将断言更改为:

    forwardingReceiver.expectMsg(ForwardedMessage("First message"))
    forwardingReceiver.expectMsg(ForwardedMessage("Second message"))
    

    这些断言本质上是有序的,所以如果事情没有按这个顺序出现,它们就会失败。这应该可以解决您的问题。

    【讨论】:

    • 完美,恰到好处,这个 Akka n00b 非常感谢TestActorRefs 的提示
    • 这里不需要使用TestActorRef。两个forwardingReceiver.expectMsg 将验证您是否按顺序收到消息。
    猜你喜欢
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-19
    • 2011-06-14
    相关资源
    最近更新 更多