如果我不知道所有消息详细信息,如何使用akka testkit测试预期消息?我能以某种方式使用下划线" _"?
示例我可以测试:
echoActor ! "hello world"
expectMsg("hello world")
示例我想测试
case class EchoWithRandom(msg: String, random: Int)
echoWithRandomActor ! "hi again"
expectMsg(EchoWithRandom("hi again", _))
我不想使用的方式:
echoWithRandomActor ! "hi again"
val msg = receiveOne(1.second)
msg match {
case EchoWithRandom("hi again", _) => //ok
case _ => fail("something wrong")
}
答案 0 :(得分:28)
看起来你可以做很多事情,因为expectMsg
使用==
behind the scenes。
您可以尝试使用expectMsgPF
,其中PF来自PartialFunction
:
echoWithRandomActor ! "hi again"
expectMsgPF() {
case EchoWithRandom("hi again", _) => ()
}
在最新版本(目前为2.5.x
)中,您需要TestProbe
。
您还可以从expectMsgPF
返回一个对象。它可能是您与模式匹配的对象或其中的一部分。这样,您可以在expectMsgPF
成功返回后进一步检查。
import akka.testkit.TestProbe
val probe = TestProbe()
echoWithRandomActor ! "hi again"
val expectedMessage = testProbe.expectMsgPF() {
// pattern matching only
case ok@EchoWithRandom("hi again", _) => ok
// assertion and pattern matching at the same time
case ok@EchoWithRandom("also acceptable", r) if r > 0 => ok
}
// more assertions and inspections on expectedMessage
有关详细信息,请参阅Akka Testing。