У меня есть следующий сценарий: родительский супервизор создает дочерний элемент для каждого сообщения, используя фабрику (функцию), переданную в конструкторе.Akka - стратегия контроля над тестированием
class supervisorActor(childActorMaker: ActorRefFactory => ActorRef)
extends Actor with ActorLogging{
def receive: Receive = {
case "testThis" =>
val childActor = childActorMaker(context)
childActor!"messageForChild"
}
override val supervisorStrategy =
OneForOneStrategy() {
case _ => Stop
}
}
class childActor extends Actor {
def receive:Receive = {
case _ => /** whatever **/
}
}
В тесте я переопределяю ребенка. Принудительное принудительное исключение. Я ожидаю, что ребенок-актер будет остановлен каждый раз из-за стратегии надзора, которую я установил.
"When the child Actor throws an exception the Supervisor Actor " should " " +
" stop it" in {
val childActorRef = TestActorRef(new childActor() {
override def receive = {
case msg: String => throw new IllegalArgumentException("kaboom")
}
})
watch(childActorRef)
val maker = (_: ActorRefFactory) => childActorRef
val supervisorActorRef = system.actorOf(Props(new supervisorActor(maker)))
supervisorActorRef!"testThis"
expectTerminated(childActorRef, 1.second)
}
Я ожидаю, что ребенок актер будет купирован из-за supervisorStrategy остановки. Вместо этого я получаю эту ошибку:
java.lang.AssertionError: assertion failed: timeout (1 second) during expectMsg: Terminated
Любая идея, почему это происходит? Thank you
Именно поэтому. Я реализовал простую фабрику для создания ребенка как context.actorOf и смотрел его - отлично работал. Спасибо @ulas! – abx78