#scala #unit-testing #akka #akka-testkit #akka-supervision
#scala #модульное тестирование #akka #akka-testkit #akka-надзор
Вопрос:
Я тестирую актер, который порождает и координирует дочерних рабочих актеров. Для этого я заменил создание дочернего субъекта на TestProbe
s, которые используются для наблюдения и имитации обмененных сообщений.
Однако я столкнулся с проблемой при попытке протестировать стратегию контроля актера. Я смог смоделировать исключение, сгенерированное внутри дочернего субъекта, установив AutoPilot
на a TestProbe
. Но оказалось, что TestProbe
по умолчанию s контролируются system guardian, и мой участник тестирования не получает уведомлений об ошибках.
Одна идея, которая пришла в голову, состоит в том, чтобы настроить промежуточный ForwarderActor
уровень s, который будет контролироваться субъектом тестирования и генерировать исключение теста, но в противном случае пересылать сообщения между TestProbe
и субъектом тестирования, например:
case class GenerateException(exception: Exception)
class ForwarderActor(phase: Phase) extends Actor {
val probe = TestProbe(phase.toString)
override def receive: Receive = {
case GenerateException(e) => throw e
case msg if sender() == probe.ref => context.parent ! msg
case msg => probe.ref ! msg
}
}
Таким образом, субъект будет контролироваться должным образом, но сообщения все равно могут быть проверены с TestProbe
помощью s.
Интересно, есть ли более простой способ добиться этого?