#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. вы пробовали использовать метод настройки, как в фрагменте кода? Если это не сработает, вы также можете попытаться преобразовать его в параметр.