макет resttemplate для тестирования службы как клиента restFul
у меня есть класс обслуживания, написанная весной, с некоторыми методами. Один из них действует как спокойный потребитель, как показано ниже:
.....
HttpEntity request = new HttpEntity<>(getHeadersForRequest());
RestTemplate restTemplate = new RestTemplate();
String url = ENDPOINT_URL.concat(ENDPOINT_API1);
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url)
.queryParam("param1", parameter1);
ReportModel infoModel = null;
try{
infoModel = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, request, ReportModel.class).getBody();
}catch (HttpClientErrorException | HttpServerErrorException e){
e.printStackTrace();
}
Я хочу использовать Mockito
чтобы издеваться над моей службой, но каждый метод, который взаимодействует с экземпляром restful server, - новый RestTemplate. Я должен создать статический класс, чтобы внедрить его в мой сервис?
2 ответов
одним из преимуществ инъекции зависимостей является возможность легко издеваться над вашими зависимостями. В вашем случае было бы намного проще создать RestTemplate
Боб:
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
и вместо использования new RestTemplate()
в вашем клиенте вы должны использовать:
@Autowired
private RestTemplate restTemplate;
для модульного тестирования с Mockito вам придется издеваться над RestTemplate
, например, с помощью:
@RunWith(MockitoJUnitRunner.class)
public class ClientTest {
@InjectMocks
private Client client;
@Mock
private RestTemplate restTemplate;
}
в этом случае Mockito будет издеваться и вводить RestTemplate
бобовые в свой Client
. Если вы не нравится издеваться и впрыскивать через отражение, вы всегда можете пойти на отдельный конструктор или сеттер, чтобы ввести RestTemplate
mock.
теперь можно написать так:
client.doStuff();
verify(restTemplate).exchange(anyString(), eq(HttpMethod.GET), any(HttpModel.class), eq(ReportModel.class));
вы, вероятно, захотите проверить больше, чем это, но это дает вам основную идею.
вы не сможете издеваться над restTemplate
используя Mockito, потому что экземпляр создается с new
ключевое слово.
вместо этого вы должны попытаться создать макет объекта в тестовом классе:
mock(RestTemplate.class)
и передать его в класс службы.
надеюсь, что это помогает.