Scala Akka测试主管错误处理
我有以下建议:Scala Akka测试主管错误处理,scala,unit-testing,akka,actor,Scala,Unit Testing,Akka,Actor,我有以下建议: 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 supervisorStra
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)
}
}
我想对上面的代码进行单元测试,基本上我是在尝试确保当异常发生时,我们仍在继续处理,如下面所示。问题是主管没有发现任何例外情况。测试下面代码的最佳方法是什么
"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))
}
我打赌问题在于这种方法:
def receive: Receive = {
case Msg => writer forward Msg
}
“case Msg”由typeclass Msg触发,而不是由class Msg的实例触发。像这样的方法应该会奏效:
def receive: Receive = {
case msg:Msg => writer forward msg
}
要在孩子抛出异常时测试主管的行为,必须测试
主管策略。使用TestActorRef
,您可以访问supervisorStrategy
的部分功能,并断言给定的异常
会导致预期的指令
val supervisor = TestActorRef[Supervisor](Props(new Supervisor(dataProvider)))
val strategy = supervisor.underlyingActor.supervisorStrategy.decider
strategy(ConnectionException("boom")) should be (Resume)
我把它打错了,这不是我的问题。我在问如何从孩子开始测试策略处理。我希望AKKA以更直观的方式命名这些方法!“decider”很模糊,但我没有看到他们为了一个小的可读性更改而更改名称(破坏向后兼容性)。哦,好吧