Регистрация всех сообщений, отправленных в Akka TestKit TestProbe

Я пытаюсь записать все сообщения, полученные TestKit TestProbe, что оказывается довольно сложно. Мне известно о разделе регистрации актеров в документах, где говорится, что следует использовать debug.receive вариант в сочетании с LogginReceive блок. Это, однако, не работает, когда я не контролирую реализацию актера.

Единственной идеей, которую я имел, было создание подклассов akka.testkit.TestActor использовать LoggingReceive а затем подкласс TestKit чтобы создать экземпляры моего TestActor подкласс вместо этого, но это не сработало, потому что большая часть функциональности там является частной akka Пространство имен (и не зря, я полагаю).

3 ответа

Решение

Извините, сначала неправильно понял ваш вопрос, так что вот мой подход.

Создайте актер-обертку, который регистрирует сообщения:

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"

Существует (вероятно, удивительно) простой ответ:

probe.setAutoPilot(new TestActor.AutoPilot {
  def run(sender: ActorRef, msg: Any) = {
    log.debug("whatever")
    this
  }
})

Используя ответ Рональда, я написал это, чтобы иметь более простой способ определения моих зондов:

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, так что это не может быть оптимальным, но отлично работает для меня.

Другие вопросы по тегам