java - 了解 Mockito 验证背后的语义

标签 java unit-testing exception junit mockito

我无法理解以下代码背后的语义。

@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 throws AbcException”,但事实并非如此。所以我的问题是为什么我需要将 throws AbcException 添加到我的测试方法中,即使它没有被抛出?有人可以帮助我理解这一点吗?

最佳答案

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

P.S.:除非您有其他设置代码,否则您模拟的 problemMethod 实际上不会抛出任何东西 - 您需要为此显式设置模拟:

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

关于java - 了解 Mockito 验证背后的语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34331518/

相关文章:

java - 我应该如何在 JRadiobutton 上使用 ActionItemListener?

javascript - Sinon - 返回不是函数

c# - 我应该创建单元测试基地吗

unit-testing - 单元测试概率分布有哪些好的做法?

python - 在Python中使用break进入异常错误处理可以吗?

java - 为什么 print 和 printf 默认显示不同的小数位数

具有多个值的Java枚举valueOf()?

Python tarfile 模块在提取过程中覆盖现有文件 - 如何禁用它?

java - JTree 节点不会在视觉上被选中

android - 如何使用__cxa_rethrow调试Android堆栈跟踪