Akka测试主管错误处理

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)