单元测试AKKA演员

时间:2014-04-07 19:38:32

标签: scala testing akka actor

我正在与ScalaAkka演员进行网络应用,我对tests遇到了一些麻烦。

在我的情况下,我需要品尝一个与数据库交谈的演员。要进行单元测试,我想使用假数据库,但我不能用我想要的假对象替换新的。

让我们看一些代码:

Class MyActor extends Actor {
    val database = new Database()

    def receive = { ... }
}

在测试中我想注入一个FakeDatabase对象而不是数据库。我一直在寻找互联网,但我找到的最好的是:

  • 向构造函数添加参数。
  • val数据库转换为var,以便在测试中我可以通过底层访问该属性并替换它。

两种解决方案都解决了问题,但非常脏。

不是解决问题的更好方法吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

此方案的两个主要选项是:

  1. 依赖注入使用DI框架根据需要注入实际或模拟服务。在Akka:http://letitcrash.com/post/55958814293/akka-dependency-injection

  2. 蛋糕模式这是一种Scala特定的方式,可以实现类似于依赖注入的内容,而无需实际依赖注入。请参阅:Akka and cake pattern

答案 1 :(得分:0)

回应这里的建议,我不会在构造函数中调用注入数据库脏。它可能有很多好处,包括将actor行为与特定数据库实例分离。

但是,如果您知道只有一个数据库,您将始终在生产代码中使用,那么请考虑定义一个包级别可访问的构造函数和一个伴随对象,默认情况下返回一个没有参数的Props对象。

以下示例:

object MyActor {

    def props() : Props = Props(new MyActor(new Database()))

}

class MyActor private[package](database : IDatabase) extends Actor {

    def receive = { ... }
}

在这种情况下,您仍然可以在测试用例中注入测试数据库(给定相同的包结构),但是阻止您的代码用户使用意外的数据库实例实例化MyActor