Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spock的Spy对象中存根一个void方法_Java_Groovy_Spock - Fatal编程技术网

Java 在Spock的Spy对象中存根一个void方法

Java 在Spock的Spy对象中存根一个void方法,java,groovy,spock,Java,Groovy,Spock,我正在使用Spock,我要测试的类包在一个间谍中。 我想隔离正在测试的方法,所以我试图剔除从正在测试的方法调用的其他方法。 通常我会使用这样的东西: 1 * classToTest.methodName(_) >> stubbed_return_value 我的问题是:methodName是一个无效的方法。 我试过这个: 1 * classToTest.methodName(_) 但实际的方法仍然被调用 如何使用Spock来存根一个void方法?您可以使用null来存根它 给定以

我正在使用Spock,我要测试的类包在一个间谍中。 我想隔离正在测试的方法,所以我试图剔除从正在测试的方法调用的其他方法。 通常我会使用这样的东西:

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(_) >> {}