Fatias de teste do Spring Boot: @WebMvcTest e @DataJpaTest
Use @WebMvcTest para testar controladores isoladamente e @DataJpaTest para testar a camada de repositórios.
Fatias de teste do Spring Boot: @WebMvcTest e @DataJpaTest é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.
O que são fatias de teste?
As fatias de teste carregam apenas a parte relevante do contexto do Spring para uma camada específica. Elas são mais rápidas que @SpringBootTest, que carrega tudo, e isolam a camada em teste.
@WebMvcTest: apenas a camada do controlador
@WebMvcTest(UserController.class) carrega apenas a camada web: controladores, filtros, configuração de segurança e Jackson. Os serviços e repositórios devem ser simulados com @MockBean.
@WebMvcTest(UserController.class)
class UserControllerTest {
@Autowired MockMvc mockMvc;
@MockBean UserService userService;
@Test
void get_user_returns_200() throws Exception {
given(userService.findById(1L)).willReturn(new UserDto(1L, "Alice"));
mockMvc.perform(get("/api/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.name").value("Alice"));
}
}Construindo solicitações com MockMvc
Construa solicitações com MockMvcRequestBuilders. Defina cabeçalhos, tipo de conteúdo e corpo da solicitação para testes de POST/PUT.
mockMvc.perform(post("/api/users")
.contentType(MediaType.APPLICATION_JSON)
.content("""{"name":"Bob","email":"bob@example.com"}"""))
.andExpect(status().isCreated())
.andExpect(header().exists("Location"));Testando a validação em @WebMvcTest
Corpos de solicitação inválidos acionam MethodArgumentNotValidException. Verifique o status 400 e o corpo da resposta de erro.
mockMvc.perform(post("/api/users")
.contentType(MediaType.APPLICATION_JSON)
.content("""{"name":"","email":"bad"}"""))
.andExpect(status().isBadRequest())
.andExpect(jsonPath("$.errors.name").exists());@DataJpaTest: apenas a camada do repositório
@DataJpaTest carrega repositórios JPA, o banco de dados H2 incorporado, o Hibernate e um TestEntityManager. Outros beans, como serviços e componentes web, não são carregados.
@DataJpaTest
class UserRepositoryTest {
@Autowired UserRepository repo;
@Autowired TestEntityManager em;
@Test
void find_by_email() {
em.persist(new User("Alice", "alice@example.com"));
em.flush();
Optional<User> found = repo.findByEmail("alice@example.com");
assertTrue(found.isPresent());
}
}TestEntityManager
TestEntityManager envolve EntityManager com métodos convenientes: persist(), flush(), find(), persistAndFlush().
User saved = em.persistAndFlush(new User("Bob", "bob@example.com"));
assertNotNull(saved.getId());
em.clear(); // detach all to force a real DB read
User fromDb = repo.findById(saved.getId()).orElseThrow();
assertEquals("Bob", fromDb.getName());Reversão de @DataJpaTest
Cada teste é executado em uma transação que, por padrão, é revertida após o teste. Os dados não persistem entre os testes, garantindo o isolamento dos testes sem limpeza manual.
@DataJpaTest // each @Test is rolled back automatically
class OrderRepositoryTest {
@Test @Transactional
void count_orders_is_zero_by_default() {
assertEquals(0, orderRepo.count());
}
}Substituindo H2 pelo banco de dados real em @DataJpaTest
Use @AutoConfigureTestDatabase(replace = Replace.NONE) para executar @DataJpaTest no banco de dados real configurado em application.properties, em vez de usar o H2.
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class ProductRepositoryTest {
// Uses the configured PostgreSQL, not H2
}@JsonTest: apenas serialização JSON
@JsonTest carrega a configuração do Jackson. Use JacksonTester para verificar se os objetos são serializados e desserializados conforme esperado.
@JsonTest
class UserDtoJsonTest {
@Autowired JacksonTester<UserDto> json;
@Test
void serializes_correctly() throws Exception {
UserDto dto = new UserDto(1L, "Alice", "alice@example.com");
assertThat(json.write(dto)).hasJsonPathStringValue("$.email");
}
}@RestClientTest: camada do cliente REST
@RestClientTest testa clientes HTTP baseados em RestTemplate ou WebClient. Ele configura um MockRestServiceServer para simular respostas HTTP.
@RestClientTest(WeatherClient.class)
class WeatherClientTest {
@Autowired WeatherClient client;
@Autowired MockRestServiceServer server;
@Test
void fetches_weather() {
server.expect(requestTo("/api/weather")).andRespond(withSuccess("""{"temp":22}""", APPLICATION_JSON));
Weather w = client.getWeather("Istanbul");
assertEquals(22, w.getTemp());
}
}Combinando fatias com @Import
As fatias excluem muitos beans por definição. Use @Import(SomeConfig.class) para adicionar classes de configuração específicas de que a fatia precisa.
@WebMvcTest(UserController.class)
@Import(SecurityConfig.class) // load security for auth tests
class SecuredControllerTest { ... }Verificação rápida
Qual banco de dados @DataJpaTest usa por padrão?
Recapitulação
@WebMvcTest testa a camada do controlador com MockMvc; simule os serviços com @MockBean. @DataJpaTest testa os repositórios com TestEntityManager e reversão automática. Use Replace.NONE para um banco de dados real. Use @JsonTest para serialização e @RestClientTest para clientes HTTP.
Perguntas Frequentes
A aula “Fatias de teste do Spring Boot: @WebMvcTest e @DataJpaTest” é grátis?
Sim — o texto completo de “Fatias de teste do Spring Boot: @WebMvcTest e @DataJpaTest” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.
O que vou aprender em “Fatias de teste do Spring Boot: @WebMvcTest e @DataJpaTest”?
Use @WebMvcTest para testar controladores isoladamente e @DataJpaTest para testar a camada de repositórios. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Java Academy?
Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Fatias de teste do Spring Boot: @WebMvcTest e @DataJpaTest”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Java Academy?
Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Testes parametrizados com @CsvSource e @MethodSource
- Mockito avançado: capturadores de argumentos e spies
- Fatias de teste do Spring Boot: @WebMvcTest e @DataJpaTest
- Testcontainers: testes de integração com banco de dados real