Как вызвать JsonProcessingException для модульного теста Java?

У меня есть метод в классе под названием «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 (библиотека Джексона), а затем внутри тела метода создается объект сопоставления из класса ObjectMapper.

ResonseMapData - это ConcurrentHashMap> из класса под названием «MessageProcessResults». Похоже, здесь он проходит через keySet и вставляет строку для пары Key Value внутри аргумента httpResponse.

Я попытался использовать mockito в картографе, чтобы вернуть искаженный JSON, но похоже, что он записывает значение в виде строки и каждый раз проходит.

Есть ли у кого-нибудь предложения или есть простой способ сделать это? Спасибо, что нашли время прочитать этот вопрос и, возможно, помогли мне: D


person ennth    schedule 13.02.2020    source источник
comment
Этот метод никогда не генерирует JsonProcessingException, он улавливает его и регистрирует только результат. Если бы вы поместили throw e в свой блок catch, он также выбросил бы его, но не продолжил бы обработку других элементов в вашем responseMapData при возникновении исключения.   -  person Mark    schedule 13.02.2020
comment
Я не уверен, зачем вам это тестировать; Я предполагаю просто получить 100% охват блока catch, но вы, по-видимому, не собираетесь проверять, произошло ли ведение журнала. Возможно, лучше об этом не беспокоиться. Но вы должны внедрить ObjectMapper вместо того, чтобы создавать его, а затем вы можете внедрить фиктивный картограф в свой тест и получить его, когда вызывается writeValueAsString.   -  person David Conrad    schedule 13.02.2020


Ответы (1)


Когда вы выполняете модульный тест, вы не сосредотачиваетесь на том, как базовый код создаст исключение, а на том, как ваш код справляется с таким исключением. В этом отношении вы можете издеваться над объектом 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.
}
person HarryQ    schedule 13.02.2020
comment
Это не будет работать, поскольку JsonProcessingException имеет конструктор, защищенный пакетом. Для тех методов, которые выдают это, вы можете использовать InputCoercionException. Он расширяется от JsonProcesssingException и позволяет что-то вроде. Уродливо, да, я знаю, но это работает: when (mockObjectMapper.writeValueAsString (any ())). ThenThrow (new InputCoercionException (null, мое фиктивное исключение, null, null)); - person theINtoy; 04.01.2021