如何在失败的情况下正确测试演员的行为

时间:2016-08-04 18:12:28

标签: scala akka akka-testkit

了解系统在特定参与者失败时的行为方式非常重要 - 恢复如何运行,快照是否正确获取等等。令人惊讶的是,我在the docs中没有找到任何建议。

我在一些示例中看到的一种方法是使用特殊的Fail msg并让演员在此消息上抛出Exception

class MyActor extends Actor {
  override def receive =
    ...
    case Fail => throw new Exception("kaboom")
}

我希望永远不要使用它,因为它混合了生产代码和测试代码,并且可能会在毫无戒心的读者中产生一些合理的WTF。

我如何诱导任意演员失败呢?

谢谢

1 个答案:

答案 0 :(得分:0)

经过一番思考后,我实施了一个快速解决方案。测试包中包含一个失败的特征,然后将其混合到演员中以进行失败测试:

object Failing{
  case object Fail
}

trait Failing {
  def failOnMsg: PartialFunction[Any, Unit] = {
    case Fail => throw new Exception("kaboom!")
  }
}

然后在测试中,PF被添加到原始receive

之前
val props = Props(new MyActor(arg) with Failing {
  override def receive = failOnMsg orElse super.receive
})

val actor = system.actorOf(props)
actor ! Fail

它仍然比以前更好,但带来了一些样板。我希望有更好的解决方案。

相关问题