0Pricing
Java Academy · Aula

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

  1. Testes parametrizados com @CsvSource e @MethodSource
  2. Mockito avançado: capturadores de argumentos e spies
  3. Fatias de teste do Spring Boot: @WebMvcTest e @DataJpaTest
  4. Testcontainers: testes de integração com banco de dados real
← Voltar para Java Academy