加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读