为什么我们抛出异常并声明它使用junit 4 + mockito抛出异常

时间:2013-12-20 05:48:08

标签: java unit-testing exception junit 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));
}

1 个答案:

答案 0 :(得分:1)

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

请记住:你断言具体数据;你嘲笑绝对需要

鉴于我不知道Constructor的完整实现,我不知道导致它失败的原因。但我知道,至少有三个条件会失败:

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

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

但我们如何做到这一点?让我们开始吧。

假设我们模拟了File的实例,无论何时何地我们决定阅读它,我们都会找回一串无效的JSON。这将是一个足够的情况来测试 - 我们无法在主机文件系统上创建一个文件(不值得为不同的文件设置旋转,所以只需将它们模拟出去就可以了),但我们可以< / em>指示来自文件的数据。

(在我写完这个答案的时候,你已经将班级名称从Constructor更改为Class。这不会飞 - 已经有Class个对象了。 )