为什么在使用方法计数时从mock抛出的异常消失了



我正在使用spock单元测试测试一些Java代码。在一个测试用例中,我需要测试当抛出异常时类的行为是否正确。我模拟了抛出异常的调用,然后测试是否调用了该方法以及返回的结果是否正确。

我使用的代码相当长,所以我把它缩小到这个例子,这是一个有点毫无意义的测试,但仍然说明了问题:

def "test if an exception is thrown on a mock"() {
given:
Object o = Mock() {
toString() >> {throw new UnsupportedOperationException("no message")}
}
when:
o.toString()
then:
thrown(UnsupportedOperationException)
}

这很好用。从mock中抛出异常,测试运行为绿色。但是,如果我添加了一个方法调用计数器,则不再抛出异常。如果我将then块更改为

then:
1 * o.toString()
thrown(UnsupportedOperationException)

测试失败。我使用调试器进行了检查,结果发现toString()现在返回null,而不是抛出异常。为什么会发生这种情况?我该怎么办?

您的案例在spock文档中得到了很好的解释。请参阅本节

为了快速解决问题,我建议

def "test if an exception is thrown on a mock"() {
given:
Object o = Mock() {
// Stubbing and Mock-verifying at the same time
1 * toString() >> {throw new UnsupportedOperationException("no message")}
}
when:
o.toString()
then:
thrown(UnsupportedOperationException)
}

最新更新