我有以下单元测试:
it should "return xml" in new TestScope {
val testProbe: TestProbe = TestProbe()
val someActor = system.actorOf(Props[SomeActor])
testProbe.send(someActor, MakeXmlApiCall())
testProbe.expectMsgPF() {
case Success(message) => {
assert(message == "someMessage")
}
}
}对于使用此receive方法的参与者:
override def receive: Receive = {
case MakeXmlApiCall() => {
val status = Future {"someMessage"}
println("In SomeActor")
status onComplete {
case Success(message) => {
sender ! message
}
}
}
}"In SomeActor“被打印出来,这意味着控件到达receive方法。
然而,我也收到了这样的信息:
[INFO] [12/15/2016 18:42:29.463] [testSystem-akka.actor.default-dispatcher-3] [akka://testSystem/deadLetters] Message [java.lang.String] from Actor[akka://testSystem/user/$a#-1159394947] to Actor[akka://testSystem/deadLetters] was not delivered. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.那么,为什么从单元测试发送给dead-letter而不是testProbe的消息。
为什么会发生这种情况?
发布于 2016-12-15 20:30:47
从将来的回调或运算符引用sender() (或任何参与者状态)是不安全的,因为sender()可能已经更改。
相反,您应该使用管道将未来传输回发件人:status.pipeTo(sender())
此外,您的expectMsgPF()调用与实际从SomeActor发送的内容不匹配。您使用的是字符串,而不是Success的实例。
https://stackoverflow.com/questions/41171738
复制相似问题