了解系统在特定参与者失败时的行为方式非常重要 - 恢复如何运行,快照是否正确获取等等。令人惊讶的是,我在the docs中没有找到任何建议。
我在一些示例中看到的一种方法是使用特殊的Fail
msg并让演员在此消息上抛出Exception
。
class MyActor extends Actor {
override def receive =
...
case Fail => throw new Exception("kaboom")
}
我希望永远不要使用它,因为它混合了生产代码和测试代码,并且可能会在毫无戒心的读者中产生一些合理的WTF。
我如何诱导任意演员失败呢?
谢谢
答案 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
它仍然比以前更好,但带来了一些样板。我希望有更好的解决方案。