【发布时间】: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