是否有任何库提供用于模拟具有特征的类的工具(两者都可以是有状态的)?
简化示例:
trait T {
var xx: List[Int] = List[Int]()
def t(x: Int) {
xx ::= x //throws NPE, xx == null, even after implicit initialization
}
}
class A extends T {
}
class Testable(a: A) {
def bar() {
a.t(2)
}
}
@Test def testFoo() {
val a: A = mock[A]
val testable = new Testable(a)
testable.bar()
verify(a).t(2)
}
答案 0 :(得分:5)
Paul Butcher一直在研究Scala模拟库Borachio。它支持模拟特征,类,函数和对象。有关更多信息,请参阅以下博客:
http://www.paulbutcher.com/2011/02/announcing-borachio-native-scala-mocking/ http://www.paulbutcher.com/2011/07/power-mocking-in-scala-with-borachio/
答案 1 :(得分:2)
嗯......我没有答案,但我想我可以提供问题所在的提示。我看了一下A.class并发现了这个(de.schauderhaft.testen是我用的包):
// Method descriptor #21 (I)V
// Stack: 2, Locals: 2
public bridge void t(int x);
0 aload_0 [this]
1 iload_1 [x]
2 invokestatic de.schauderhaft.testen.T$class.t(de.schauderhaft.testen.T, int) : void [26]
5 return
Line numbers:
[pc: 0, line: 13]
Local variable table:
[pc: 0, pc: 6] local: this index: 0 type: de.schauderhaft.testen.A
[pc: 0, pc: 6] local: x index: 1 type: int
我不是字节码专家,但是这个
2 invokestatic de.schauderhaft.testen.T$class.t(de.schauderhaft.testen.T, int) : void [26]
看起来对t(Int)的调用实际上是一个静态方法的调用,你不能模拟静态方法。 PowerMock会有所帮助,但可能难以使用。
答案 2 :(得分:1)
我刚刚发布了ScalaMock 2.0。除了函数和接口,ScalaMock还可以模拟: