java - 为什么我们要抛出异常并使用junit 4 +mockito断言它抛出异常

标签 java unit-testing exception junit mockito

我正在学习mockito和单元测试。这是我的构造函数。为了测试构造函数是否抛出 jparse 异常,我有一个测试方法。为什么我们要生成自己的异常并断言它。测试情况如何?我们在这里测试什么?请帮忙!

public ClassA(File file) throws JsonParseException,
        JsonMappingException, IOException {
    ObjectMapper json= new ObjectMapper();
    Map<String, String>> readValue= mapper.readValue(file,
            Map.class);
    ..........
}

@Test(expected = JsonParseException.class)
public void testCorruotionInContent() throws Exception {
    ObjectMapper json= Mockito.mock(ObjectMapper.class);
    PowerMockito.whenNew(ObjectMapper.class).withNoArguments()
            .thenReturn(json);
    Mockito.when(
            mapper.readValue(Mockito.any(File.class), Mockito.eq(Map.class)))
            .thenThrow(new JsonParseException(null, null));
    new ClassA(Mockito.mock(File.class));
}

最佳答案

您的测试很脆弱 - 正如评论中指出的那样,您没有测试有关具体实现的任何内容,而是测试了模拟。我什至不相信您正在测试任何东西。

请记住:您针对具体数据进行断言;你 mock 你绝对需要的东西。

鉴于我不知道Constructor的完整实现,我不知道什么会导致它失败。然而,我确实知道,至少在三种条件下它会失败:

  • 某种 IOException - 可能文件不存在或无法读取
  • 某种 JsonMappingException - 对象无法映射到 JSON
  • 某种 JsonParseException - 无法解析 JSON 实体

最好测试所有这些条件,以确保您的代码在出现任何异常时正常运行。如果您不希望您的代码能够处理它,那么它抛出这些异常是可以接受的,并且当您的代码中出现这种情况时,您正在验证是否确实抛出了异常。

但是我们如何做到这一点呢?让我们从简单的开始。

假设我们模拟了 File 的实例,无论何时何地我们决定读取它,我们都会得到一串无效的 JSON。这将是一个足够的测试案例 - 我们无法在主机文件系统上创建文件(不值得为启动不同的文件而头痛,因此简单地模拟它们是可以接受的),但是我们可以 指示来自文件的数据。

(在我写这个答案时,您已将类名称从 Constructor 更改为 Class。这不会成功 - 已经有一个 对象。)

关于java - 为什么我们要抛出异常并使用junit 4 +mockito断言它抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20697132/

相关文章:

java - 在 Intellij IDEA 中运行 Maven 目标的键盘快捷方式?

java - 如何使用 JUnit 在 Java 中测试具有 boolean 返回类型的方法

c# - 异常或 If/Else 语句

php - 如果提供的 PDO 参数多于需要,如何检查 PHP

JavaFX - 执行 JavaFX WebView 示例代码时出现 java.lang.reflect.InitationTargetException

Java 二进制文件下载提前停止

Java获取不在arraylist中的元素

visual-studio-2008 - 在调试单元测试时,Visual Studio为什么不打破异常?

Android:对服务进行单元测试

android - 运行时异常、view.InflateException、reflection.InvocationTargetException 和 OutOfMemoryError