Spring JUnit — как правильно тестировать?
Всем привет! В общем, попал в непонятную ситуацию, я прохожу стажировку в компании и делаю интеграцию с сервисом (через RestTemplate), но проблема в том, что я интегрируюсь с сервисом, которого не существует (это сделано для того, чтобы тренироваться именно в той области, с которой работает компания — банковской). После того, как я написал метод, взаимодействующий с сервисом, мне необходимо написать для него тесты. А теперь, собственно, сам вопрос: как писать тесты для интеграции с нерабочим сервисом? Мне просто нужно их написать, чтобы они были, но не работали или существуют какие-то заглушки для тестирования такого рода? Ниже привел фрагмент кода, который мне нужно покрыть тестами
@Data
@Service
@RequiredArgsConstructor
public class ClientProfileServiceImpl implements ClientProfileService {
private final RestTemplate restTemplate;
private final ApplicationProperties applicationProperties;
public ClientGeneralInfo getClientInfoByGUID(@NonNull String guid) {
URI uri = UriComponentsBuilder.fromHttpUrl(applicationProperties.getClientProfileService().getHost())
.path(applicationProperties.getClientProfileService().getClientInfoByGuidPath())
.queryParam("clientGUID", guid)
.build()
.toUri();
ResponseEntity<ClientGeneralInfo> response =
restTemplate.getForEntity(uri, ClientGeneralInfo.class);
ClientGeneralInfo clientInfo = response.getBody();
if ((response.getStatusCode() != HttpStatus.OK) || (clientInfo) == null) {
throw new ClientException(ErrorCode.PROFILE_NOT_FOUND, guid);
}
if ((clientInfo.getAccountList() == null) || (clientInfo.getAccountList().size() == 0)) {
throw new ClientException(ErrorCode.ACCOUNT_NOT_FOUND, guid);
}
return clientInfo;
}
}
Естесственно, при попытки запустить вылетает — org.springframework.web.client.ResourceAccessException: I/O error on GET request for "###": Этот хост неизвестен (###); nested exception is java.net.UnknownHostException
Ответы (1 шт):
Есть следующие пути решения этой задачи:
Сделать подмену RestTempalte на mock на уровне исходного кода (с помощью Mockito). Здесь при создании сервиса, использующего RestTemplate, необходимо в конструктор сервиса вместо RestTemplate подсунуть его mock такой, который будет запрограммирован на вызовы определенных методов определенным образом с конкретным результатом. Все параметры надо подобрать самому. Плюсы: легко реализовать. Минусы: решение не позволяет проверить работу сетевой части, проконтролировать соблюдение контракта не получится.
Воспользоваться WireMock. Для WireMock есть обвязка на java, в SpringBoot придется встраивать самостоятельно. WireMock поднимает самодостаточный отдельный mock-сервер (на выделенном порту), который можно настроить на прием, валидацию и генерацию ответов в соответствии с контрактом. Это долго, это сложно, но это не требует внесения изменений в исходное решение и позволяет полностью протестировать контракт взаимодействия с внешней системой.