使用Spock在Spy对象中存根void方法

DwB*_*DwB 6 java groovy spock

我正在使用Spock,将要测试的课程包装在一个Spy中。我想隔离正在测试的方法,所以我试图从正在测试的方法中删除其他调用的方法。通常,我会使用类似以下的内容:

1 * classToTest.methodName(_) >> stubbed_return_value
Run Code Online (Sandbox Code Playgroud)

我的问题是:这 methodName是一个无效方法。我尝试了这个:

1 * classToTest.methodName(_)
Run Code Online (Sandbox Code Playgroud)

但是实际的方法仍然被调用。

如何使用Spock消除void方法?

tim*_*tes 7

你可以用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我们想要隐藏该sideEffect方法,因此它无法执行任何操作,因此我们可以使用以下规范:

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 == []
    }
}
Run Code Online (Sandbox Code Playgroud)


vad*_*dim 6

您还可以返回一个空闭包(而不是 null):

1 * complex.sideEffect(_) >> {}
Run Code Online (Sandbox Code Playgroud)