记录发送到Akka TestKit TestProbe的所有消息

时间:2012-11-16 16:43:42

标签: scala akka testkit

我正在尝试记录TestKit TestProbe收到的所有收到的消息,这被证明有点困难。我知道文档中的Actor Logging部分,其中应该将debug.receive选项与LogginReceive块结合使用。然而,当我无法控制演员的实现时,这不起作用。

我唯一的想法是将akka.testkit.TestActor子类化为使用LoggingReceive然后子类TestKit来使其创建我的TestActor子类的实例,但这并不是'因为大多数功能都是akka名称空间的私有功能(我认为有充分的理由)。

3 个答案:

答案 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"