Как охватить метод внутри ArrayList в mockito junits

#java #mockito

Вопрос:

Я пытаюсь охватить ниже основной класс, если (!Utility.isEmpty(ошибки)) покрытие кода блока, и я попробовал ниже код для добавления ошибок в список массивов внутри клиентского класса, но все равно массив отображается как пустой, может ли кто-нибудь помочь мне решить эту проблему.

Основной класс

 public void processDiohShippingMethod(ShippingMethodRequest request) {
        List<ResolvableErrorEnum> errors = new ArrayList<>();
        checkoutRestClient.updateShippingMethod(request, errors);
        if (!Utility.isEmpty(errors)) {
            logger.info("ProcessDiohShippingMethod: Shipping method update failure  from {} -> {}. Reverting. ",
                    existingSm, request.getShippingMethodType());
            if (existingShippingMethod != null amp;amp; Constants.RTG_ENJOY.equalsIgnoreCase(existingSm)) {
                request.setStartTime(existingShippingMethod.getDropOffShippingInfo().getStartTime());
                request.setEndTime(existingShippingMethod.getDropOffShippingInfo().getEndTime());
                request.setScheduleType(existingShippingMethod.getDropOffShippingInfo().getCustomerScheduleType());
            }
        }
    }
 

Клиент

 public void updateShippingMethod(ShippingMethodRequest request, List<ResolvableErrorEnum> errors) {
    String url = Utils.formatHttpUrl(url, Cart_Request);
    try {
        HttpEntity<?> entity = new HttpEntity<>(request);
        JsonNode jsonNode = restTemplate.postForObject(url, entity, JsonNode.class);
        if (!jsonNode.has(Constants.CONTENT)
                || !jsonNode.path(Constants.CONTENT).path(Constants.ERRORS).isMissingNode()) {
            errors.add(ErrorMessages.SM_ERR_01);
            return;
        }
    } catch (HttpClientErrorException e) {
        errors.add(ErrorMessages.SM_ERR_01);
    } catch (HttpServerErrorException e) {
        errors.add(ErrorMessages.SM_ERR_01);
    }
}
 

Тест

 @Test
    public void test_processMethod() throws Exception {
        Request req = new Request();
        HttpEntity<?> entity = new HttpEntity<>(req);
        String jsonResponse = "{"error":{"errorId":"1234","message":"error message"}},"status":"success"}}";
        ObjectMapper mapper = new ObjectMapper();
        JsonNode actualObj = mapper.readTree(jsonResponse);
        when(restTemplate.postForObject("url", entity, JsonNode.class)).thenReturn(actualObj);

        ShippingMethodResponse response = helper.processDiohShippingMethod(req);
    }
 

Ответ №1:

Поскольку вы не разнести весь тестовый код, это всего лишь предположение, но наиболее вероятная причина заключается в том, что ваш helper объект (в одном из испытаний метод) использует другой экземпляр, а не тот, который вы издевались (так как я не вижу какой-либо код в тесте, что бы клиенту).

Таким образом, решение может выглядеть следующим образом:

 @Test
public void test_processMethod() throws Exception {
    Request req = new Request();
    HttpEntity<?> entity = new HttpEntity<>(req);
    String jsonResponse = "{"error":{"errorId":"1234","message":"error message"}},"status":"success"}}";
    ObjectMapper mapper = new ObjectMapper();
    JsonNode actualObj = mapper.readTree(jsonResponse);
    when(restTemplate.postForObject("url", entity, JsonNode.class)).thenReturn(actualObj);

    //get this mocked object into the helper object somehow
    //otherwhise the mocked method will never be called
    helper.setClient(restTemplate);

    ShippingMethodResponse response = helper.processDiohShippingMethod(req);
}
 

Вы, вероятно, предположили, что насмешливый вызов when(restTemplate.postForObject(...))... издевается над методом для всех объектов этого класса. Но это просто создаст объект декоратора / оболочки вокруг объекта. Поэтому вы должны убедиться, что вызываете метод mocked для объекта mocked, но не для любого другого объекта.

Комментарии:

1. как мы можем поместить издевательский объект во вспомогательный класс?

2. вы пробовали использовать метод настройки, как в фрагменте кода? Если это не сработает, вы также можете попытаться преобразовать его в параметр.