如何为Java单元测试触发JsonProcessingException?
我在一个名为“HttpResponseHelper”的类中有一个方法,当它抛出JsonProcessingException时,我试图对该方法进行单元测试,但我很难让它这么做:如何为Java单元测试触发JsonProcessingException?,java,unit-testing,jackson,jsonexception,Java,Unit Testing,Jackson,Jsonexception,我在一个名为“HttpResponseHelper”的类中有一个方法,当它抛出JsonProcessingException时,我试图对该方法进行单元测试,但我很难让它这么做: private static void populateHTTPResponseWithData(ObjectNode httpResponse) { ObjectMapper mapper = new ObjectMapper(); responseMapData.keySet
private static void populateHTTPResponseWithData(ObjectNode httpResponse)
{
ObjectMapper mapper = new ObjectMapper();
responseMapData.keySet().forEach(item -> {
try
{
httpResponse.put(item, mapper.writeValueAsString(responseMapData.get(item)));
}
catch (JsonProcessingException e)
{
LOGGER.error("Json Processing Exception", e);
}
});
}
httpResponse参数是ObjectNode类型(Jackson库),然后在方法体中从ObjectMapper类创建映射器对象
resonseMapData是来自名为“MessageProcessResults”的类的ConcurrentHashMap>。它在这里看起来像是在键集中循环,并在httpResponse参数中插入键值对的字符串
我尝试在mapper上使用mockito返回格式不正确的JSON,但它似乎将值写入字符串并每次传递
有人有什么建议吗?有没有简单的方法?感谢您花时间阅读此问题并可能帮助我:D当您进行单元测试时,您不会关注底层代码如何创建异常,而是关注您的代码如何处理此类异常。在这方面,您可以模拟
ObjectNode
对象,并要求它在调用put
方法时抛出异常
@Test
public void someTest(){
Object mockObject = Mockito.mock(ObjectNode.class);
Mockito.when(mockObject.put()).thenThrow(new JsonProcessingException ("my mock exception"));
functionUndertest(mockObject); //this is where you inject your mock function. In your case you are expecting a error message to be printed.
}
此方法从不抛出
JsonProcessingException
,它捕获它并只记录结果,如果将throw e
放在catch块中,它也会抛出它,但当异常发生时,它不会继续处理响应数据中的其他项。我不确定您为什么需要测试它;我假设只是为了得到catch块的100%覆盖率,但您可能不会测试日志记录是否发生。最好不要担心它。但是您应该插入ObjectMapper而不是创建一个,然后您可以在测试中插入一个模拟映射器,并在调用writeValueAsString时将其抛出。这不起作用,因为JsonProcessingException有一个包保护的构造函数。对于引发此问题的方法,可以使用InputImpressionException。它从JsonProcesssingException扩展而来,并允许类似的操作。丑陋,是的,我知道,但它是有效的:when(mockObjectMapper.writeValueAsString(any())。thenthow(newInputImportionException(null,“我的模拟异常”,null,null));