我在理解以下代码背后的语义时遇到问题。

@Test
public void TestAbc() throws AbcException {
    // method to test
    object.handle();

    // assertions
    verify(someThing).someMethod();
    verify(problemObject).problemMethod();
}


handle方法的定义如下:

public void handle() {
    try {
        someThing.someMethod();
        // throws AbcException
        problemObject.problemMethod();
    }
    catch (AbcException e) {
        LOGGER.error(e.getMessage());
    }
}


现在,在测试中,我正在执行throws AbcException来使语法在语法上正确无误,但这实际上没有任何意义,因为我在handle方法中捕获了该异常,并且没有将其进一步抛出。但是测试方法会转换为“ TestAbc引发AbcException”,实际上并非如此。所以我的问题是,为什么即使我的测试方法没有抛出throws AbcException,也需要添加它?有人可以帮我理解吗?

最佳答案

verify(problemObject)返回Mockito类的实例,该实例用于指定要验证的内容。为了使您可以简单地在此对象上调用problemMethod()的流利的语法,该类实现了problemObject所模拟的接口(或扩展了该类)。即使此类中的problemMethod()只是具有检查是否在模拟程序上调用了problemMethod()的效果,Java编译器也不知道这一点,只会看到您正在调用签名为throws AbcException的方法,因此您需要处理它。

附注:除非您有其他设置代码,否则模拟的problemMethod实际上不会抛出任何内容-您需要为此明确设置模拟:

when(problemObject.problemMethod()).thenThrow(new AbcException());

10-04 11:21