Spock 支持模拟和验证被模拟对象的方法被调用了多少次。这里的问题是,在上面的实现中,无法从 X.sum 方法内部访问 Y 类的模拟实例。
如果您在 Y 的实例在其构造函数中传递/作为sum 方法的参数时以某种方式重写 X 类:
class X {
fun sum(a: Int, b: Int, y: Y) {
y.add(a, b)
}
}
...并打开Y 类和add 方法,以便可以创建和测试模拟(可以通过all open compiler plugin 或直接完成):
open class Y {
open fun add(a: Int, b: Int) {}
}
...然后测试模拟的Y 类的add 方法只被调用一次(带有尊重的参数)是相当容易的:
def testYAddWasCalledExactlyOnceWhenCallToXSum() {
given:
Y y = Mock()
def x = new X()
when:
x.sum(1, 2, y)
then:
1 * y.add(1, 2)
}
只要确保你的类路径中有byte-buddy
我还想要一个 Y 的存根,它返回 add >> 10
有可能,但首先你需要让add函数返回Int:
open class Y {
open fun add(a: Int, b: Int) : Int { return a + b }
}
然后你又可以使用 Mock 了:
def testYAsStub() {
given:
Y y = Mock()
y.add(1, 0) >> 10
when:
def sum = y.add(1, 0)
then:
sum == 10
}