Guia rápido para @RestClientTest na Inicialização do Spring
1. Introdução
Este artigo é uma introdução rápida à anotação@RestClientTest.
A nova anotação ajuda a simplificar e acelerar o teste dos clientes REST em seus aplicativos Spring.
2. Suporte ao cliente REST no Spring Boot Pre-1.4
O Spring Boot é uma estrutura útil que fornece muitos beans Spring configurados automaticamente com configurações típicas que permitem que você se concentre menos na configuração de um aplicativo Spring e mais no código e na lógica de negócios.
Mas na versão 1.3 não recebemos muita ajuda quando queremos criar ou testar clientes de serviços REST. Seu suporte para clientes REST não é muito profundo.
Para criar um cliente para uma API REST - uma instânciaRestTemplate normalmente é usada. Normalmente, ele deve ser configurado antes do uso e sua configuração pode variar, portanto, o Spring Boot não fornece nenhum beanRestTemplate configurado universalmente.
O mesmo vale para testar clientes REST. Antes do Spring Boot 1.4.0, o procedimento de teste de um cliente Spring REST não era muito diferente do que em qualquer outro aplicativo baseado em Spring. Você criaria uma instânciaMockRestServiceServer, vincularia à instânciaRestTemplate em teste e forneceria respostas simuladas a solicitações, como esta:
RestTemplate restTemplate = new RestTemplate();
MockRestServiceServer mockServer =
MockRestServiceServer.bindTo(restTemplate).build();
mockServer.expect(requestTo("/greeting"))
.andRespond(withSuccess());
// Test code that uses the above RestTemplate ...
mockServer.verify();
Você também teria que inicializar o contêiner Spring e garantir que apenas os componentes necessários sejam carregados no contexto, para acelerar o tempo de carregamento do contexto (e, consequentemente, o tempo de execução do teste).
3. Novos recursos de cliente REST no Spring Boot 1.4+
No Spring Boot 1.4, a equipe fez um esforço sólido para simplificar e acelerar a criação e o teste de clientes REST.
Então, vamos verificar os novos recursos.
3.1. Adicionando Spring Boot ao seu projeto
Primeiro, você precisa se certificar de que seu projeto está usando Spring Boot 1.4.x ou superior:
org.springframework.boot
spring-boot-starter-parent
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
As versões de lançamento mais recentes podem ser encontradashere.
3.2. RestTemplateBuilder
Spring Boot traz oRestTemplateBuilder auto-configurado para simplificar a criação deRestTemplates, e a anotação@RestClientTest correspondente para testar os clientes construídos comRestTemplateBuilder. Veja como você pode criar um cliente REST simples comRestTemplateBuilder injetado automaticamente para você:
@Service
public class DetailsServiceClient {
private final RestTemplate restTemplate;
public DetailsServiceClient(RestTemplateBuilder restTemplateBuilder) {
restTemplate = restTemplateBuilder.build();
}
public Details getUserDetails(String name) {
return restTemplate.getForObject("/{name}/details",
Details.class, name);
}
}
Observe que não conectamos explicitamente a instânciaRestTemplateBuilder a um construtor. Isso é possível graças a um novo recurso do Spring chamado injeção de construtor implícito, que é discutido emthis article.
RestTemplateBuilder fornece métodos convenientes para registrar conversores de mensagem, manipuladores de erro, manipuladores de modelo de URI, autorização básica e também usar quaisquer personalizadores adicionais de que você precisa.
3.3. @RestClientTest
Para testar esse cliente REST construído comRestTemplateBuilder, você pode usar uma classe de teste executada porSpringRunner anotada com@RestClientTest. Esta anotação desativa a configuração automática completa e aplica apenas a configuração relevante aos testes do cliente REST, ou seja, Configuração automática Jackson ou GSON e beans@JsonComponent, mas não beans@Component regulares.
@RestClientTest garante que o suporte a Jackson e GSON seja configurado automaticamente e também adiciona instâncias pré-configuradasRestTemplateBuildereMockRestServiceServer ao contexto. O bean em teste é especificado com o atributovalue oucomponents da anotação@RestClientTest:
@RunWith(SpringRunner.class)
@RestClientTest(DetailsServiceClient.class)
public class DetailsServiceClientTest {
@Autowired
private DetailsServiceClient client;
@Autowired
private MockRestServiceServer server;
@Autowired
private ObjectMapper objectMapper;
@Before
public void setUp() throws Exception {
String detailsString =
objectMapper.writeValueAsString(new Details("John Smith", "john"));
this.server.expect(requestTo("/john/details"))
.andRespond(withSuccess(detailsString, MediaType.APPLICATION_JSON));
}
@Test
public void whenCallingGetUserDetails_thenClientMakesCorrectCall()
throws Exception {
Details details = this.client.getUserDetails("john");
assertThat(details.getLogin()).isEqualTo("john");
assertThat(details.getName()).isEqualTo("John Smith");
}
}
Em primeiro lugar, precisamos garantir que este teste seja executado comSpringRunner adicionando a anotação@RunWith(SpringRunner.class).
Quais as novidades?
First - a anotação@RestClientTest nos permite especificar o serviço exato em teste - no nosso caso, é a classeDetailsServiceClient. Este serviço será carregado no contexto de teste, enquanto todo o resto é filtrado.
Isso nos permite autowire a instânciaDetailsServiceClient dentro de nosso teste e deixar todo o resto de fora, o que acelera o carregamento do contexto.
Second - como a instânciaMockRestServiceServer também está configurada para um teste anotado@RestClientTest (e vinculada à instânciaDetailsServiceClient para nós), podemos simplesmente injetá-la e usá-la.
Finally - o suporte JSON para@RestClientTest nos permite injetar a instânciaObjectMapper de Jackson para preparar o valor de resposta simuladaMockRestServiceServer’s.
Resta apenas executar a chamada ao nosso serviço e verificar os resultados.
4. Conclusão
Neste artigo, discutimos a nova anotação@RestClientTest que permite o teste fácil e rápido de clientes REST construídos com Spring.
O código-fonte do artigo está disponívelon GitHub.