30.14. Desenvolvendo APIs REST com Spring Boot: Testes unitários e de integração
Ao desenvolver uma API REST com o Spring Boot, garantir a qualidade do código e a confiabilidade dos endpoints é essencial. Uma maneira eficaz de alcançar esse objetivo é implementar testes unitários e de integração. Nesta seção, vamos explorar como criar e executar esses testes dentro de um projeto Spring Boot, garantindo que sua API REST funcione como esperado.
Testes Unitários
Testes unitários são a base para qualquer estratégia de teste em desenvolvimento de software. Eles são rápidos, isolados e focam em uma pequena parte do código, como métodos ou classes. No contexto do Spring Boot, geralmente utilizamos frameworks como JUnit e Mockito para escrever testes unitários.
JUnit
O JUnit é um framework de teste para a linguagem de programação Java que nos permite escrever e executar testes repetíveis. Com o JUnit, podemos assegurar que os métodos das nossas classes estão funcionando conforme o esperado.
Mockito
Mockito é uma framework que permite criar objetos simulados (mocks) em testes unitários. Isso é útil quando precisamos testar a lógica de uma classe sem depender de suas dependências externas, como bancos de dados ou outros serviços.
Exemplo de Teste Unitário
@SpringBootTest
public class UserServiceTest {
@MockBean
private UserRepository userRepository;
@Autowired
private UserService userService;
@Test
public void whenSaveUser_thenSuccess() {
User user = new User("John Doe", "john.doe@example.com");
Mockito.when(userRepository.save(user)).thenReturn(user);
User created = userService.createUser(user);
assertThat(created.getName()).isEqualTo(user.getName());
assertThat(created.getEmail()).isEqualTo(user.getEmail());
}
}
No exemplo acima, estamos testando o método createUser
de UserService
. Utilizamos @MockBean
para simular o UserRepository
e @Autowired
para injetar a instância de UserService
que queremos testar. Com o Mockito, simulamos o comportamento do método save
do repositório para retornar o usuário que estamos criando. Assim, podemos verificar se o serviço está funcionando corretamente sem a necessidade de interagir com o banco de dados.
Testes de Integração
Testes de integração são importantes para garantir que diferentes partes do sistema funcionem juntas. No Spring Boot, podemos usar o Spring MVC Test Framework para simular chamadas HTTP para a API e verificar o comportamento da aplicação como um todo.
Spring MVC Test Framework
Este framework permite que você escreva testes que enviam requisições HTTP para o DispatcherServlet (o front controller do Spring MVC) e verificam as respostas. Com isso, é possível testar os controladores, rotas e status de resposta sem a necessidade de implantar a aplicação em um servidor web real.
Exemplo de Teste de Integração
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class UserControllerIntegrationTest {
@Autowired
private MockMvc mockMvc;
@Test
public void whenGetUser_thenStatus200() throws Exception {
mockMvc.perform(get("/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("John Doe"))
.andExpect(jsonPath("$.email").value("john.doe@example.com"));
}
}
No exemplo acima, usamos @SpringBootTest
com a opção webEnvironment
para iniciar o contexto do Spring Boot e disponibilizar um servidor web em uma porta aleatória. Com o @AutoConfigureMockMvc
, o Spring Boot configura automaticamente o MockMvc
, que é um ponto central para os testes de integração no Spring MVC. Utilizamos o MockMvc
para simular uma requisição GET para o endpoint /users/1
e verificamos se a resposta tem o status HTTP 200 (OK), além de verificar se o conteúdo da resposta contém os dados esperados.
Considerações Finais
Testes unitários e de integração são fundamentais no desenvolvimento de APIs REST com Spring Boot. Eles ajudam a garantir que cada parte do código funcione isoladamente e que todas as partes trabalhem juntas conforme esperado. Com o uso de frameworks como JUnit e Mockito, junto com as facilidades do Spring MVC Test Framework, você pode construir um conjunto robusto de testes que aumentarão a confiança no seu código e reduzirão a possibilidade de bugs em produção.
Além disso, uma estratégia de testes bem definida facilita a manutenção e a evolução da aplicação, pois qualquer alteração que quebre a funcionalidade existente será prontamente identificada pelos testes. Portanto, invista tempo e recursos para escrever e manter testes de qualidade, e sua API REST com Spring Boot será muito mais sólida e confiável.