如何为Java单元测试触发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

我在一个名为“HttpResponseHelper”的类中有一个方法,当它抛出JsonProcessingException时,我试图对该方法进行单元测试,但我很难让它这么做:

 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));