我正在学习模拟和单元测试。这是我的构造函数。为了测试它抛出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));
}
答案 0 :(得分:1)
你的测试很脆弱 - 正如评论中指出的那样,你没有测试任何关于具体实现的东西,而是模拟。我甚至不相信你正在测试任何东西。
请记住:你断言具体数据;你嘲笑绝对需要。
鉴于我不知道Constructor
的完整实现,我不知道导致它失败的原因。但我知道,至少有三个条件会失败:
IOException
- 可能该文件不存在或无法读取JsonMappingException
- 对象无法映射到JSON JsonParseException
- 无法解析JSON实体最好测试所有这些条件,以确保在出现任何这些异常时代码的行为正确。如果您不希望您的代码处理它,那么它可以抛出这些异常,并且当您的代码中出现这种情况时,您将验证是否实际抛出了异常。
但我们如何做到这一点?让我们开始吧。
假设我们模拟了File
的实例,无论何时何地我们决定阅读它,我们都会找回一串无效的JSON。这将是一个足够的情况来测试 - 我们无法在主机文件系统上创建一个文件(不值得为不同的文件设置旋转,所以只需将它们模拟出去就可以了),但我们可以< / em>指示来自文件的数据。
(在我写完这个答案的时候,你已经将班级名称从Constructor
更改为Class
。这不会飞 - 已经有Class
个对象了。 )