0Pricing
Java Academy · Lección

Slices de prueba de Spring Boot: @WebMvcTest y @DataJpaTest

Use @WebMvcTest para probar controladores de forma aislada y @DataJpaTest para probar la capa de repositorios.

Slices de prueba de Spring Boot: @WebMvcTest y @DataJpaTest es una lección gratuita de Java Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Java Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Java Academy incluye 4 lecciones en total.

¿Qué son los test slices?

Los test slices cargan únicamente la parte relevante del contexto de Spring para una capa específica. Son más rápidos que @SpringBootTest, que lo carga todo, y aíslan la capa sometida a prueba.

@WebMvcTest: solo la capa de controladores

@WebMvcTest(UserController.class) carga únicamente la capa web: controladores, filtros, configuración de seguridad y Jackson. Los servicios y repositorios deben simularse con @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"));
    }
}

Construir solicitudes con MockMvc

Construya solicitudes con MockMvcRequestBuilders. Establezca las cabeceras, el tipo de contenido y el cuerpo de la solicitud para las pruebas 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"));

Probar la validación en @WebMvcTest

Los cuerpos de solicitud no válidos desencadenan MethodArgumentNotValidException. Compruebe que el estado sea 400 y valide el cuerpo de la respuesta de error.

mockMvc.perform(post("/api/users")
        .contentType(MediaType.APPLICATION_JSON)
        .content("""{"name":"","email":"bad"}"""))
    .andExpect(status().isBadRequest())
    .andExpect(jsonPath("$.errors.name").exists());

@DataJpaTest: solo la capa de repositorios

@DataJpaTest carga los repositorios JPA, la base de datos H2 integrada, Hibernate y un TestEntityManager. Los demás beans, como los servicios y los componentes web, no se cargan.

@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 envuelve EntityManager y proporciona métodos prácticos: 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());

Rollback de @DataJpaTest

Cada prueba se ejecuta en una transacción que, de forma predeterminada, se revierte después de la prueba. Los datos no persisten entre pruebas, lo que garantiza el aislamiento sin necesidad de realizar una limpieza manual.

@DataJpaTest  // each @Test is rolled back automatically
class OrderRepositoryTest {
    @Test @Transactional
    void count_orders_is_zero_by_default() {
        assertEquals(0, orderRepo.count());
    }
}

Reemplazar H2 por una base de datos real en @DataJpaTest

Utilice @AutoConfigureTestDatabase(replace = Replace.NONE) para ejecutar @DataJpaTest contra la base de datos real configurada en application.properties en lugar de H2.

@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
class ProductRepositoryTest {
    // Uses the configured PostgreSQL, not H2
}

@JsonTest: solo serialización JSON

@JsonTest carga la configuración de Jackson. Utilice JacksonTester para comprobar que los objetos se serialicen y deserialicen según lo 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: capa de clientes REST

@RestClientTest prueba clientes HTTP basados en RestTemplate o WebClient. Configura un MockRestServiceServer para simular las respuestas 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());
    }
}

Combinar slices con @Import

Los slices excluyen muchos beans por diseño. Utilice @Import(SomeConfig.class) para añadir las clases de configuración específicas que necesita el slice.

@WebMvcTest(UserController.class)
@Import(SecurityConfig.class)  // load security for auth tests
class SecuredControllerTest { ... }

Comprobación rápida

¿Qué base de datos utiliza @DataJpaTest de forma predeterminada?

Resumen

@WebMvcTest prueba la capa de controladores con MockMvc; simule los servicios con @MockBean. @DataJpaTest prueba los repositorios con TestEntityManager y realiza un rollback automático. Utilice Replace.NONE para una base de datos real. Use @JsonTest para la serialización y @RestClientTest para los clientes HTTP.

Preguntas frecuentes

¿La lección «Slices de prueba de Spring Boot: @WebMvcTest y @DataJpaTest» es gratis?

Sí — el texto completo de «Slices de prueba de Spring Boot: @WebMvcTest y @DataJpaTest» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Java Academy, actualiza a CoddyKit PRO. El curso de Java Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Slices de prueba de Spring Boot: @WebMvcTest y @DataJpaTest»?

Use @WebMvcTest para probar controladores de forma aislada y @DataJpaTest para probar la capa de repositorios. Practicas Java Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Java Academy?

No se requiere experiencia previa. Java Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «Slices de prueba de Spring Boot: @WebMvcTest y @DataJpaTest»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Java Academy?

Sí. Cada lección de Java Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Pruebas parametrizadas con @CsvSource y @MethodSource
  2. Mockito avanzado: capturadores de argumentos y spies
  3. Slices de prueba de Spring Boot: @WebMvcTest y @DataJpaTest
  4. Testcontainers: pruebas de integración con una base de datos real
← Volver a Java Academy