Explorando o Spring Boot TestRestTemplate

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.