2016-08-04 72 views
1

了解系统在特定角色发生故障时的行为如何非常重要 - 恢复如何运行,快照是否正确取回等。令人惊讶的是,我还没有找到对此的任何建议the docs如何在出现故障时正确测试角色行为

我在某些示例中看到的一种方法是有一个特殊的Fail味精,并让演员在此味精上抛出Exception

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

我希望永远不要因为它混合生产代码和测试代码,并可能会产生在不知情的读者一些合理WTFs使用它。

我该如何诱导任意演员正常失败?

谢谢

回答

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 

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