2016-01-28 4 views
0

У меня есть следующий сценарий: родительский супервизор создает дочерний элемент для каждого сообщения, используя фабрику (функцию), переданную в конструкторе.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

ответ

3

Похоже, что childActorRef не создан с помощью контекста supervisorActorRef (я имею в виду ActorContext of supervisorActor, который вы создали в тестовом коде). Так childActor (childActorRef) не является ребенком руководителя-инструктора (supervisorActorRef) в вашем тестовом коде. Вот почему стратегия супервайзера supervisorActor не служит цели.

+0

Именно поэтому. Я реализовал простую фабрику для создания ребенка как context.actorOf и смотрел его - отлично работал. Спасибо @ulas! – abx78