Resolución del error Failed to load ApplicationContext en pruebas unitarias de Spring Boot

Al desarrollar pruebas unitarias o de integración en aplicaciones Spring Boot, es habiutal inyectar dependencias como servicios (Services) para validar su comportameinto. Sin embargo, al ejecutar estas pruebas, el framework puede lanzar una excepción crítica durante la fase de inicialización del contexto.

A continuación, se muestra el registro de error típico que se presenta cuando el contenedor de inversión de control no logra arrancar correctamente:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.7.5)

java.lang.IllegalStateException: Failed to load ApplicationContext
    at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132)
    at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:123)
    at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190)
    at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132)
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227)
    ...

Análisis de la causa raíz

Este fallo ocurre frecuentemente en proyectos que utilizan perfiles de configuración múltiples (por ejemplo, local, dev, prod). Cuando el entorno de pruebas de Spring intenta construir el ApplicationContext, no encuentra una directiva clara sobre qué perfil debe cargar. Esto provoca que ciertas propiedades de base de datos, conexiones a servicios externos o beans condicionales no se resuelvan, detonando el colapso del contexto.

Implementación de la solución

Para corregir este comportamiento, es necesario indicarle explícitamente al TestContextManager qué perfil de configuración debe utilizar durante la ejecución de la suite de pruebas. Esto se logra mediante la anotación @ActiveProfiles.

A continuación, se presenta un ejemplo de cómo estructruar la clase de prueba aplicando esta corrección:

package com.example.demo.service;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;

import static org.junit.jupiter.api.Assertions.assertNotNull;

@SpringBootTest
@ActiveProfiles("qa")
public class InventoryServiceTest {

    @Autowired
    private InventoryService inventoryService;

    @Test
    void validateContextInitialization() {
        assertNotNull(inventoryService, "El servicio de inventario no fue inyectado correctamente");
    }
}

Al especificar el perfil (en este caso qa), Spring Boot cargará el archivo de propiedades correspondiente (como application-qa.yml o application-qa.properties), asegurando que las dependencias y configuraciones condicionales se resuelvan correctamente durante el ciclo de vida del contexto de pruebas.

Etiquetas: spring-boot spring-test ApplicationContext activeprofiles java-testing

Publicado el 7-9 16:16