我在我的小项目中使用scalate和scalamock。我创建了一个特征和一个类,以及它的配套对象。
trait A{
def getSomething(arg1)
}
class B(field1)....
object B extends A{
def apply(arg1) = new B(getSomething(arg1))
}
代码运行良好,但在测试此代码时出现问题。单元测试应该是独立的,因此我应该以某种方式模拟/存根特征 A:
val fakeA = stub[A]
(fakeA.getSomething _).when(arg).returns(res)
现在。。。我应该如何在我的单元测试中使用这个模拟特征?模拟创建一个对象(而不是类型),使用这样的代码,我无法将其"传递"到我的对象(或使用)。我怎样才能实现我的目标(在我的 B 对象中存根/模拟 getSomething())?我试图将对象B拆分为Blogic和B扩展Blogic。但那又如何呢?
Scala 中的对象是单例实例,意思是"世界末日"。它们不能被继承、嘲笑(没有黑客)或其他任何东西。您有以下选择:
- 直接测试您的对象,即调用
B.apply(...)
并将测试结果测试结果更改为预期结果。 - 将对象功能提取到特征/类中,让它将所有功能混合在一起
第二个解决方案示例
trait A{
def getSomething(arg1: Int): Int = ???
}
trait BFactoryUsingA { self: A => // This says that it needs/requires A
def apply(arg1: Int) = new B(getSomething(arg1))
}
class B(field1: Int) {}
object B extends BFactoryUsingA with A {
// No methods or those which have nothing to do with traits A and BFactoryUsingA hierarchy and composition
}
在测试中,您现在可以编写:
// Instance as anonymous mixin of traits containing logic
val instanceUnderTest = new BFactoryUnsingA with A { }
我不能说你是否有能力和奢侈地将你的对象分解成特征。大多数情况下,这是可行的,没有太多麻烦,但您的里程可能会有所不同。这种解决方案的另一个优点是根本不需要模拟。
希望对你有帮助