Java 在Spock的Spy对象中存根一个void方法
我正在使用Spock,我要测试的类包在一个间谍中。 我想隔离正在测试的方法,所以我试图剔除从正在测试的方法调用的其他方法。 通常我会使用这样的东西:Java 在Spock的Spy对象中存根一个void方法,java,groovy,spock,Java,Groovy,Spock,我正在使用Spock,我要测试的类包在一个间谍中。 我想隔离正在测试的方法,所以我试图剔除从正在测试的方法调用的其他方法。 通常我会使用这样的东西: 1 * classToTest.methodName(_) >> stubbed_return_value 我的问题是:methodName是一个无效的方法。 我试过这个: 1 * classToTest.methodName(_) 但实际的方法仍然被调用 如何使用Spock来存根一个void方法?您可以使用null来存根它 给定以
1 * classToTest.methodName(_) >> stubbed_return_value
我的问题是:methodName
是一个无效的方法。
我试过这个:
1 * classToTest.methodName(_)
但实际的方法仍然被调用
如何使用Spock来存根一个void方法?您可以使用
null
来存根它
给定以下Java类:
public class Complex {
private final List<String> sideEffects = new ArrayList<>();
protected void sideEffect(String name) {
sideEffects.add("Side effect for " + name);
}
public int call(String name) {
sideEffect(name);
return name.length();
}
public List<String> getSideEffects() {
return sideEffects;
}
}
还可以返回空闭包(而不是null):
以防任何像我这样无知的人在某个时候来到这里:在斯波克,你不能嘲笑私有方法:它们会像间谍一样正常运行。我发现Spock的这种“局限性”(实际上是因为它没有测试意义)令人惊讶,因为您可以在测试代码中从您的间谍处调用这些方法(并且似乎模拟它们)。。。如果斯波克不允许这样做或将其标记为错误,这可能会很好。。。
class ComplexSpec extends Specification {
def 'we can ignore void methods in Spies'() {
given:
Complex complex = Spy()
when:
int result = complex.call('tim')
then:
result == 3
1 * complex.sideEffect(_) >> null
complex.sideEffects == []
}
}
1 * complex.sideEffect(_) >> {}