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

2022-09-04 19:33:41

我正在使用Spock,我的类测试被包装在间谍中。我想隔离正在测试的方法,因此我正在尝试从正在测试的方法中存根出其他方法。通常我会使用这样的东西:

1 * classToTest.methodName(_) >> stubbed_return_value

我的问题是:是一个空的方法。我试过这个:methodName

1 * classToTest.methodName(_)

但实际方法仍然被调用。

如何使用 Spock 存根 void 方法?


答案 1

你可以用...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;
    }
}

我们想要隐藏该方法,因此它不执行任何操作,因此我们可以使用以下规范: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 == []
    }
}

答案 2

您也可以返回一个空的闭包(而不是空值):

1 * complex.sideEffect(_) >> {}

推荐