1

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

我在一些例子中看到的一种方法是有一个特殊的Failmsg 并让演员Exception在这个 msg 上抛出一个。

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

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

我将如何诱导任意演员正确失败?

谢谢

4

1 回答 1

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

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

于 2016-08-04T18:43:21.783 回答