макет 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)

и передать его в класс службы.

надеюсь, что это помогает.