我正在与Scala
和Akka
演员进行网络应用,我对tests
遇到了一些麻烦。
在我的情况下,我需要品尝一个与数据库交谈的演员。要进行单元测试,我想使用假数据库,但我不能用我想要的假对象替换新的。
让我们看一些代码:
Class MyActor extends Actor {
val database = new Database()
def receive = { ... }
}
在测试中我想注入一个FakeDatabase对象而不是数据库。我一直在寻找互联网,但我找到的最好的是:
val
数据库转换为var
,以便在测试中我可以通过底层访问该属性并替换它。两种解决方案都解决了问题,但非常脏。
不是解决问题的更好方法吗?
谢谢!
答案 0 :(得分:0)
此方案的两个主要选项是:
依赖注入使用DI框架根据需要注入实际或模拟服务。在Akka:http://letitcrash.com/post/55958814293/akka-dependency-injection
蛋糕模式这是一种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
。