es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Prueba de integración de Spring Boot simulando dependencia externa

Estoy intentando crear pruebas de integración para mi aplicación Spring Boot. La idea es lanzar una base de datos de PostgreSQL incrustada y ejecutar llamadas HTTP con TestRestTemplate a mis controladores.

El problema es que mi proyecto tiene una dependencia que usamos para las colas de Redis.

<dependency>
      <groupid>com.github.sonus21</groupid>
      <artifactid>rqueue-spring-boot-starter</artifactid>
      <version>2.9.0-RELEASE</version>
</dependency>

He intentado simular las dependencias y la mayoría funcionan, pero con esta parece que se queja supongo que porque es una @Configuration y no un @Component:

Clase de configuración de la dependencia:

@Configuration
@AutoConfigureAfter({RedisAutoConfiguration.class})
@ComponentScan({"com.github.sonus21.rqueue.web", "com.github.sonus21.rqueue.dao"})
public class RqueueListenerAutoConfig extends RqueueListenerBaseConfig {
    public RqueueListenerAutoConfig() {
    }
...
}

Mi clase de configuración de prueba:

@TestConfiguration
public class TestRestTemplateConfig {
    @Bean
    @Primary
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public RqueueListenerAutoConfig rqueueListenerAutoConfig() {
        return Mockito.mock(RqueueListenerAutoConfig.class);
    }
    ....
}

He intentado con @AutoConfigureOrder(1) en mi clase de configuración, pero la clase original RqueueListenerAutoConfig se lanza antes de todo y mis beans simulados aún no han sido declarados.

Para ser honesto, simular cada servicio de esa dependencia es un dolor, pero no he encontrado una forma de simular toda la dependencia con una sola configuración. He intentado no cargar la dependencia cuando estoy en el perfil de prueba, pero como se ejecuta el contexto de Spring, mi código la necesita.

Mi clase de prueba tiene la siguiente configuración:

@SpringBootTest
@Import(TestRestTemplateConfig.class)
@ActiveProfiles("test")
public class TestClass {
    ...
}

¿Alguna pista?

Gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para crear pruebas de integración para una aplicación Spring Boot con una base de datos Postgres embebida y una dependencia de cola Redis

    Al intentar crear pruebas de integración para una aplicación Spring Boot que incluye una dependencia de cola Redis, es posible que encuentre errores debido a la configuración de la dependencia. Específicamente, la dependencia puede tener @Configuration en lugar de @Component, lo cual puede causar fallas en las pruebas. Aquí hay una posible solución a este problema:

    Primero, cree una clase de configuración de prueba que extienda la RedisAutoConfiguration original.

    @Configuration
    @AutoConfigureAfter({RedisAutoConfiguration.class})
    public class TestRedisAutoConfiguration extends RedisAutoConfiguration {
    
        // Sobrescribe el bean RedisConnectionFactory con un objeto simulado
        @Bean
        @Primary
        public RedisConnectionFactory redisConnectionFactory() {
            return Mockito.mock(RedisConnectionFactory.class);
        }
    
        // Sobrescribe el bean RedisTemplate con un objeto simulado
        @Bean
        @Primary
        public RedisTemplate<string, object=""> redisTemplate() {
            RedisTemplate<string, object=""> mockRedisTemplate = Mockito.mock(RedisTemplate.class);
            return mockRedisTemplate;
        }
    
        // Sobrescribe el bean RqueueListenerAutoConfig con un objeto simulado
        @Bean
        @Primary
        @Order(Ordered.HIGHEST_PRECEDENCE)
        public RqueueListenerAutoConfig rqueueListenerAutoConfig() {
            return Mockito.mock(RqueueListenerAutoConfig.class);
        }
    }
    

    Luego, actualice su clase TestRestTemplateConfig para importar esta clase TestRedisAutoConfiguration.

    @TestConfiguration
    @Import(TestRedisAutoConfiguration.class)
    public class TestRestTemplateConfig {
    
        // Crea un bean TestRestTemplate
        @Bean
        public TestRestTemplate testRestTemplate() {
            return new TestRestTemplate();
        }
    
    }
    

    Finalmente, actualice la clase de prueba para incluir la configuración de la dependencia de cola Redis. Puede hacer esto agregando la anotación @Import a la propia clase de prueba.

    @SpringBootTest
    @ActiveProfiles("test")
    @Import({TestRedisAutoConfiguration.class, TestRestTemplateConfig.class})
    public class IntegrationTests {
    
        // Usa el bean TestRestTemplate creado en la clase TestRestTemplateConfig
        @Autowired
        private TestRestTemplate restTemplate;
    
        // Escribe aquí tus pruebas de integración
        @Test
        public void testIntegration() {
    
            ResponseEntity<string> response = restTemplate.getForEntity(
              "/example", String.class);
    
            assertEquals(HttpStatus.OK, response.getStatusCode());
            assertEquals("Hola, mundo", response.getBody());
        }
    }
    

    Con estos cambios, deberías poder ejecutar pruebas de integración en tu aplicación Spring Boot con una dependencia de cola Redis. ¡Buena suerte!</string,></string,>

Comments are closed.