Mam następujący:Akka błąd testowania kierownik obsługi
class Supervisor(dataProvider: DatabaseClientProvider) extends Actor {
val writer = context.actorOf(Props(classOf[Child], dataProvider.get))
def receive: Receive = {
case Msg => writer forward msg
}
override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 100) {
case e: ConnectionException => Resume
}
}
class Child(db: DatabaseClient) extends Actor {
def receive: Receive = {
case msg:Msg => db.write(text)
}
}
Chcę testów jednostkowych powyższym kodzie zasadzie staram się upewnić, gdy wystąpi wyjątek, jesteśmy nadal wznowienie przetwarzania, jak widać poniżej. Problem polega na tym, że nadzorca nie przyjmuje żadnego wyjątku. Jaki jest najlepszy sposób na przetestowanie poniższego kodu?
"resume handling messages when exception occurs" in {
// Given
val msg1 = Msg("Some msg1")
val msg2 = Msg("Some msg2")
//Throw an exception when attempting to write msg1
val databaseClient = mock[DatabaseClient]
when(databaseClient.write(msg1.text).thenThrow(ConnectionException("Error!"))
val dataProvider = mock[DatabaseClientProvider]
when(dataProvider.get).thenReturn(databaseClient)
val supervisor = system.actorOf(Props(new Supervisor(dataProvider)))
// When
intercept[ConnectionException] {
supervisor ! msg1
}
// When
supervisor ! msg2
// Then
verify(databaseClient.write("Some msg"), times(2))
}
Mam nadzieję, że AKKA nadaje te metody w bardziej intuicyjny sposób! – Mayumi
"Zdecydowanie" jest niejasne, ale nie widzę, żeby zmieniały nazwę (zrywając kompatybilność wsteczną) ze względu na niewielką zmianę czytelności. No cóż –