Pruebas por capas, no un arranque completo
Deja de arrancar toda tu aplicación para una sola prueba de controlador. En Spring, un @SpringBootTest completo conecta todas las capas — web, servicios, datos, configuración — lo cual es exactamente correcto para comportamiento entre capas y exactamente incorrecto como hábito por defecto. Spring Boot incluye slice tests (pruebas por capas) diseñados para cargar solo la capa bajo prueba, y la diferencia se acumula en cada clase de prueba y cada corrida de CI.
Qué carga realmente un slice test
Cada anotación de slice @…Test hace dos cosas: restringe el escaneo de componentes a los beans relevantes de esa capa, e importa solo un conjunto reducido de auto-configuraciones en lugar de todas.
@WebMvcTestcarga únicamente la capa MVC:@Controller,@ControllerAdvice, converters, filtros, interceptores y beansWebMvcConfigurer. Los beans@Componenty@ConfigurationPropertiescomunes no se escanean. Auto-configuraMockMvc(yMockMvcTestercuando AssertJ está en el classpath), así que pruebas el manejo de requests sin un servidor corriendo. Los colaboradores se sustituyen con@MockitoBean.@DataJpaTestcarga entidades y repositorios de Spring Data JPA, los apunta a una base de datos embebida de prueba, te da unTestEntityManagery hace rollback de la transacción al final de cada prueba por defecto.- La misma familia cubre otras capas:
@JsonTestpara serialización,@JdbcTestpara SQL directo,@RestClientTestpara clientes HTTP salientes,@WebFluxTestpara controladores reactivos,@DataMongoTestpara Mongo. El mapeo completo de anotación a auto-configuración está en el apéndice de Spring Boot (ver Recursos).
Reglas prácticas
| Estás probando… | Usa | No |
|---|---|---|
| Ruteo, códigos de estado, validación de un controlador | @WebMvcTest(MyController.class) | @SpringBootTest |
| Una consulta de repositorio o mapeo de entidad | @DataJpaTest | @SpringBootTest |
| Serialización JSON de un DTO | @JsonTest | una prueba de controlador |
| Un cliente REST saliente | @RestClientTest | pegarle a la API real |
| Comportamiento real entre capas (wiring, transacciones entre capas, seguridad end-to-end) | @SpringBootTest | apilar mocks en un slice |
Una restricción que conviene conocer: no puedes combinar varias anotaciones de slice @…Test en una misma clase. Elige el slice que corresponde a la capa y agrega extras con la anotación @AutoConfigure… correspondiente si hace falta.
Un slice de controlador en la práctica
@WebMvcTest(UserVehicleController.class)
class UserVehicleControllerTests {
@Autowired
private MockMvc mvc;
@MockitoBean
private UserVehicleService userVehicleService;
@Test
void returnsVehicleDetails() throws Exception {
given(userVehicleService.getVehicleDetails("sboot"))
.willReturn(new VehicleDetails("Honda", "Civic"));
mvc.perform(get("/sboot/vehicle"))
.andExpect(status().isOk())
.andExpect(content().string("Honda Civic"));
}
}
Sin datasource, sin capa de servicios, sin contexto completo — solo la capa web y un stub.
Por qué importa para programar con IA
Un asistente de IA aprende los hábitos de tu código con el ejemplo. Si cada prueba existente es un @SpringBootTest de arranque completo, el asistente tomará la herramienta más pesada para cada prueba nueva que escriba — y tu ciclo de feedback se degrada un archivo generado a la vez. Siembra el repositorio con slice tests y declara la convención explícitamente en las instrucciones del proyecto: "las pruebas de controladores usan @WebMvcTest, las de repositorios usan @DataJpaTest, @SpringBootTest se reserva para comportamiento entre capas." Las pruebas generadas seguirán entonces el camino rápido por defecto.
Nivel avanzado: aprovecha el caché de contextos
El framework de pruebas de Spring cachea contextos de aplicación entre pruebas — un contexto se construye una vez por configuración única y se reutiliza, con un límite por defecto de 32 contextos (desalojo LRU; se ajusta con -Dspring.test.context.cache.maxSize). Dos hábitos maximizan los aciertos:
- Mantén las configuraciones idénticas. Cada
@MockitoBean, perfil o propiedad modificada crea un contexto nuevo. Estandariza tus configuraciones de slice para que decenas de clases de prueba compartan un solo contexto cacheado. - Observa el caché en CI. Pon
org.springframework.test.context.cacheen nivelDEBUGpara ver cuántos contextos distintos construye realmente tu suite. Una suite que construye 20 contextos te está diciendo que tus configuraciones de prueba se desviaron.
Recursos
- Testing Spring Boot applications — referencia oficial
- Anotaciones de test slice y sus auto-configuraciones — apéndice
@WebMvcTest— javadoc de la API@DataJpaTest— javadoc de la API- Caché de contextos — Spring TestContext framework
¿Construyendo una función con IA? Yeda AI diseña, audita y entrega sistemas LLM de producción.