Регистрация всех сообщений, отправленных в 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, так что это не может быть оптимальным, но отлично работает для меня.