我正在学习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/