dat*_*ser 7 unit-testing scala actor akka
我有以下内容:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
我想在单元测试上面的代码基本上我试图确保当异常发生时,我们仍然恢复处理,如下所示.问题是主管没有抓住任何例外.测试下面代码的最佳方法是什么?
"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))
}
Run Code Online (Sandbox Code Playgroud)
Jak*_*ene 12
要在孩子抛出异常时测试主管的行为,你必须测试supervisorStrategy.使用a TestActorRef,您可以访问supervisorStrategy部分函数并断言给定的Exception结果是预期的Directive
val supervisor = TestActorRef[Supervisor](Props(new Supervisor(dataProvider)))
val strategy = supervisor.underlyingActor.supervisorStrategy.decider
strategy(ConnectionException("boom")) should be (Resume)
Run Code Online (Sandbox Code Playgroud)