Java 如何在使用Mockito从列表创建Json时抛出JsonProcessingException?
我正在尝试使用jackson对catch块进行单元测试,以将列表转换为Json格式。这是我的密码:Java 如何在使用Mockito从列表创建Json时抛出JsonProcessingException?,java,json,unit-testing,exception,mockito,Java,Json,Unit Testing,Exception,Mockito,我正在尝试使用jackson对catch块进行单元测试,以将列表转换为Json格式。这是我的密码: public String convert(List<POJO> list) { ObjectMapper objectMapper = new ObjectMapper(); try { data = objectMapper.writeValueAsString(list); } catch (JsonP
public String convert(List<POJO> list) {
ObjectMapper objectMapper = new ObjectMapper();
try {
data = objectMapper.writeValueAsString(list);
} catch (JsonProcessingException exception) {
System.out.println("Exception message: {}", exception.getMessage());
}
return data;
}
公共字符串转换(列表){
ObjectMapper ObjectMapper=新的ObjectMapper();
试一试{
data=objectMapper.writeValueAsString(列表);
}捕获(JsonProcessingException异常){
System.out.println(“异常消息:{}”,Exception.getMessage());
}
返回数据;
}
我尝试过这样的单元测试:
@Mock
ObjectMapper mockObjectMapper;
@Test(expected = JsonProcessingException.class)
public void doThrowException() throws JsonProcessingException {
doThrow(JsonProcessingException.class).when(mockObjectMapper).writeValueAsString(any());
dataTransformer.convert(new ArrayList<>());
verify(mockObjectMapper.writeValueAsString(any()));
}
@Mock
对象映射器模拟对象映射器;
@测试(预期为JsonProcessingException.class)
public void doThrowException()引发JsonProcessingException{
doThrow(JsonProcessingException.class).when(mockObjectMapper.writeValueAsString(any());
convert(新的ArrayList());
验证(mockObjectMapper.writeValueAsString(any()));
}
我一直在努力让我的头脑去全面覆盖这个单元测试。我查了好几篇关于这个的文章,但是运气不好。由于我是单元测试领域的新手,我有一种感觉,我在这里肯定遗漏了一些东西。1)您的测试逻辑在实现方面是不正确的。在实现中,您捕获异常,因此在异常测试用例中,您将永远无法获得预期的异常
2) 如注释中所述,如果依赖项在类的客户端代码中不可见,则不能模拟ObjectMapper
。在这里,它没有任何方式来嘲弄这个班级。您可以添加一个构造函数或setter来设置它,但这有意义吗
3) 的确,你不应该在这里嘲笑。被测组件将一些列表元素映射到字符串。您不想模拟,而是在异常情况和标称情况下测试映射逻辑。否则,您的测试将不会有很大的价值。要获得
JsonProcessingException
,您可以从这篇文章的优秀答案中得到启发 在方法中创建新实例时,不能模拟objectmapper。需要传入/注入是的,我理解。但在这种情况下,如何测试异常呢。我不确定将生成什么类型的输入jsonprocessingexception
。有什么建议吗?我想我通过抛出JsonProcessingException解决了覆盖率问题。你是如何做到的?我已更新以回答您的第一条评论。我现在不是捕获异常,而是抛出异常。这里唯一的问题是,我必须在所有调用此方法的方法中抛出异常。这样,单元测试覆盖率为100%