我正在尝试记录TestKit TestProbe收到的所有收到的消息,这被证明有点困难。我知道文档中的Actor Logging部分,其中应该将debug.receive
选项与LogginReceive
块结合使用。然而,当我无法控制演员的实现时,这不起作用。
我唯一的想法是将akka.testkit.TestActor
子类化为使用LoggingReceive
然后子类TestKit
来使其创建我的TestActor
子类的实例,但这并不是'因为大多数功能都是akka
名称空间的私有功能(我认为有充分的理由)。
答案 0 :(得分:14)
有一个(可能令人惊讶的)简单答案:
probe.setAutoPilot(new TestActor.AutoPilot {
def run(sender: ActorRef, msg: Any) = {
log.debug("whatever")
this
}
})
答案 1 :(得分:5)
使用Ronald的回答我写这个是为了更简单的方法来定义我的探针:
object LoggingTestProbe {
def apply()(implicit system: ActorSystem) : TestProbe = {
val probe = TestProbe()
probe.setAutoPilot(new TestActor.AutoPilot {
def run(sender: ActorRef, msg: Any) = {
val other = sender.path
val me = probe.ref.path
system.log.debug(s"$me received $msg from $other")
this
}
})
probe
}
}
完成此操作后,我使用LoggingTestProbe()
代替TestProbe()
来定义我的探针。
我是Scala的新手,所以这可能不是最佳选择,但对我来说非常有用。
答案 2 :(得分:4)
抱歉,一开始你的问题有点不对,所以这是我的方法。
创建一个记录消息的包装器actor:
class LoggingActor(fac: => Actor) extends Actor {
val underlying = context.system.actorOf(Props(fac))
def receive = {
LoggingReceive {
case x ⇒ underlying.tell(x, sender)
}
}
}
然后创建TestActorRef
,将您的演员包裹在LoggingActor
:
val echo = TestActorRef(new LoggingActor(new FooActor))
echo ! "hello world"