8

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

我唯一的想法是akka.testkit.TestActor使用 aLoggingReceive子类,然后使用子类TestKit来创建我的子类的实例TestActor,但这不起作用,因为大多数功能都是akka命名空间私有的(我想这是有充分理由的)。

4

3 回答 3

14

有一个(可能令人惊讶)简单的答案:

probe.setAutoPilot(new TestActor.AutoPilot {
  def run(sender: ActorRef, msg: Any) = {
    log.debug("whatever")
    this
  }
})
于 2012-11-21T15:20:58.827 回答
5

使用罗纳德的回答我写了这个有一个更简单的方法来定义我的探针:

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 的新手,所以这可能不是最佳的,但对我来说非常有用。

于 2013-12-27T19:04:07.087 回答
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"
于 2012-11-16T18:28:24.573 回答