Yeda AI Tips · #075

English

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.

Reglas prácticas

Estás probando…UsaNo
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@JsonTestuna prueba de controlador
Un cliente REST saliente@RestClientTestpegarle a la API real
Comportamiento real entre capas (wiring, transacciones entre capas, seguridad end-to-end)@SpringBootTestapilar 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:

Recursos

Read this article in English

¿Construyendo una función con IA? Yeda AI diseña, audita y entrega sistemas LLM de producción.

Habla con nosotros · Lee el blog