scala – Akka测试主管错误处理
发布时间:2020-12-16 18:41:26 所属栏目:安全 来源:网络整理
导读:我有以下内容: 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)) } 解决方法
要在孩子抛出异常时测试主管的行为,您必须测试supervisorStrategy.使用TestActorRef,您可以访问supervisorStrategy的部分函数,??并断言给定的Exception会产生预期的指令
val supervisor = TestActorRef[Supervisor](Props(new Supervisor(dataProvider))) val strategy = supervisor.underlyingActor.supervisorStrategy.decider strategy(ConnectionException("boom")) should be (Resume) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |