Explorando o Spring Boot TestRestTemplate
1. Visão geral
Este artigo explora o Spring BootTestRestTemplate. Pode ser tratado como um acompanhamento deThe Guide to RestTemplate, que recomendamos firmemente a leitura antes de focar emTestRestTemplate. TestRestTemplate pode ser considerado uma alternativa atraente deRestTemplate.
2. Dependências do Maven
Para usarTestRestTemplate, é necessário ter uma dependência apropriada como:
org.springframework.boot
spring-boot-test
2.1.0.RELEASE
Você pode encontrar a versão mais recente emMaven Central.
3. TestRestTemplate eRestTemplate
Esses dois clientes são bastante adequados para escrever testes de integração e podem lidar muito bem com a comunicação com APIs HTTP.
Por exemplo, eles nos fornecem os mesmos métodos, métodos padrão, cabeçalhos e outras construções HTTP.
E todas essas operações são bem descritas emThe Guide to RestTemplate, então não vamos revisitá-las aqui.
Aqui está um exemplo simples de solicitação GET:
TestRestTemplate testRestTemplate = new TestRestTemplate();
ResponseEntity response = testRestTemplate.
getForEntity(FOO_RESOURCE_URL + "/1", String.class);
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
Apesar do fato de que ambas as classes são muito semelhantes,TestRestTemplate não estendeRestTemplate e oferece alguns recursos novos muito interessantes.
4. O que há de novo emTestRestTemplate?
4.1. Construtor com credenciais de autenticação básica
TestRestTemplate fornece um construtor com o qual podemoscreate a template with specified credentials for basic authentication.
Todas as solicitações executadas usando esta instância serão autenticadas usando as credenciais fornecidas:
TestRestTemplate testRestTemplate
= new TestRestTemplate("user", "passwd");
ResponseEntity response = testRestTemplate.
getForEntity(URL_SECURED_BY_AUTHENTICATION, String.class);
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
4.2. Construtor comHttpClientOption
TestRestTemplate também nos permite personalizar o cliente Apache HTTP subjacente usandoHttpClientOption which é um enum emTestRestTemplate com as seguintes opções:ENABLE_COOKIES, ENABLE_REDIRECTS eSSL.
Vamos ver um exemplo rápido:
TestRestTemplate testRestTemplate = new TestRestTemplate("user",
"passwd", TestRestTemplate.HttpClientOption.ENABLE_COOKIES);
ResponseEntity response = testRestTemplate.
getForEntity(URL_SECURED_BY_AUTHENTICATION, String.class);
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK))
No exemplo acima, estamos usando as opções junto com a autenticação básica.
Se não precisarmos de autenticação, ainda podemos criar um modelo com um construtor simples:
TestRestTemplate (TestRestTemplate.HttpClientOption.ENABLE_COOKIES)
4.3. Novo método
Os construtores não apenas podem criar um modelo com credenciais especificadas. Também podemos adicionar credenciais após a criação do nosso modelo. TestRestTemplate nos dá um métodowithBasicAuth() que adiciona credenciais a um modelo já existente:
TestRestTemplate testRestTemplate = new TestRestTemplate();
ResponseEntity response = testRestTemplate.withBasicAuth(
"user", "passwd").getForEntity(URL_SECURED_BY_AUTHENTICATION,
String.class);
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
5. Usando Ambos TestRestTemplate eRestTemplate
TestRestTemplate pode funcionar como um invólucro paraRestTemplate, por exemplo se formos forçados a usá-lo porque estamos lidando com código legado. Você pode ver abaixo como criar um invólucro tão simples:
RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder();
restTemplateBuilder.configure(restTemplate);
TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplateBuilder);
ResponseEntity response = testRestTemplate.getForEntity(
FOO_RESOURCE_URL + "/1", String.class);
assertThat(response.getStatusCode(), equalTo(HttpStatus.OK));
6. Conclusão
TestRestTemplate não é uma extensão deRestTemplate, mas sim uma alternativa que simplifica o teste de integração e facilita a autenticação durante os testes. Ajuda na customização do cliente Apache HTTP, mas também pode ser usado como um wrapper deRestTemplate.
Você pode verificar os exemplos fornecidos neste artigoover on GitHub.