Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Akka测试主管错误处理_Scala_Unit Testing_Akka_Actor - Fatal编程技术网

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”很模糊,但我没有看到他们为了一个小的可读性更改而更改名称(破坏向后兼容性)。哦,好吧