====== 04 - Pruebas de integración de módulos ====== **Spring Modulith** permite iniciar módulos de aplicación de forma aislada o junto con sus dependencias, para probar la integración con un contexto Spring más acotado que el de toda la aplicación. ===== 1. Pruebas de un módulo ===== Se añade el starter de pruebas y se coloca ''@ApplicationModuleTest'' en una clase del paquete del módulo o de uno de sus subpaquetes: @ApplicationModuleTest class OrderIntegrationTests { // Pruebas del módulo orders. } Por defecto se inicia únicamente el módulo actual (**STANDALONE**). También se puede incluir: ^ Modo ^ Módulos cargados ^ | **STANDALONE** | El módulo de la prueba | | **DIRECT_DEPENDENCIES** | El módulo y sus dependencias directas | | **ALL_DEPENDENCIES** | El módulo y todas sus dependencias transitivas | La prueba configura el escaneo de componentes y auto-configuración para los paquetes incluidos. ===== 2. Dependencias hacia otros módulos ===== Si un bean del módulo necesita un bean de otro módulo y este no está incluido, el arranque puede fallar. En pruebas centradas en un módulo suele convenir simular la dependencia externa con ''@MockitoBean'' en vez de ampliar el contexto sin necesidad. Muchas dependencias hacia otros módulos pueden indicar acoplamiento elevado; conviene revisar si algunas colaboraciones pueden expresarse mediante eventos. ===== 3. Combinar pruebas verticales y slices ===== ''@ApplicationModuleTest'' delimita la aplicación por módulo (**corte vertical**). ''@ModuleSlicing'' permite combinar ese límite con las pruebas por capa de Spring Boot, como ''@DataJpaTest'' (**corte horizontal**). ===== 4. Escenarios con eventos ===== La API ''Scenario'' simplifica pruebas de listeners transaccionales y asíncronos. Un escenario: - Publica un evento o invoca un bean expuesto por el módulo. - Configura opcionalmente el tiempo máximo de espera. - Espera un evento resultante o un cambio de estado observable. - Verifica el evento o resultado. scenario.publish(new OrderCompleted(42L)) .andWaitForEventOfType(StockReserved.class) .matching(event -> event.orderId().equals(42L)) .toArriveAndVerify(event -> assertEquals(42L, event.orderId())); La publicación estímulo se ejecuta en una transacción nueva para que los listeners transaccionales puedan procesarla. Los cambios de estado persistidos no se revierten automáticamente al terminar el test; se limpian explícitamente. ===== 5. Ejecución de tests sensible a cambios ===== El artefacto ''spring-modulith-junit'' puede omitir pruebas de módulos no afectados por los cambios. En general ejecuta pruebas del módulo modificado y de módulos que dependen de él. La optimización se desactiva en casos como cambios de build o recursos de classpath, ejecuciones explícitas desde el IDE o ausencia de cambios detectables. En CI se puede configurar un commit de referencia para determinar qué archivos cambiaron. La propiedad ''spring.modulith.test.on-no-changes'' permite elegir qué hacer si no se detectan cambios. ===== Referencia ===== * [Documentación oficial: Integration Testing Application Modules](https://docs.spring.io/spring-modulith/reference/testing.html) (Spring Modulith 2.1.1).