首页 文章

在集成测试中禁用带有redis的spring会话

提问于
浏览
2

我正在使用redis的spring会话,但我想在进行测试时禁用它 . 我的课程注释:

@ActiveProfiles("integrationtests")

和我的application-integrationtests.tml文件包含:

spring.autoconfigure.exclude: org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration

但它仍然失败:

Caused by: org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool

如果我打开redis-server,测试工作,但当然我不想保持这种方式; )

// update

我一直在努力

@SpringBootTest(classes = {Application.class})
@ActiveProfiles("integrationtests")

和包含Redis的Application.class:

@SpringBootApplication(exclude={SessionAutoConfiguration.class, RedisAutoConfiguration.class, RedisHttpSessionConfiguration.class})
public class Application {

public static void main(String[] args) throws Exception {
    SpringApplication.run(Application.class, args);
}
}

但它失败了:

Error creating bean with name 'redisMessageListenerContainer' defined in class path resource [org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.class]

spring autoconfigure debug看到我已经排除了这个类,但它没有效果:

Exclusions:
-----------

org.springframework.boot.autoconfigure.session.SessionAutoConfiguration

org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration

org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration

2 回答

  • 0

    我在测试时用来解决这个Redis依赖的解决方法是在测试时使用 @ConditionalOnProperty 注释并设置属性( testing=true ) .

    使用以下代码进行会话配置:

    @Configuration
    public class SessionConfig {
        @ConditionalOnProperty(name = "testing", havingValue = "false", matchIfMissing = true)
        @EnableRedisHttpSession
        public static class RedisSessionConfig {
        }
    
        @ConditionalOnProperty(name = "testing", havingValue = "true")
        @EnableSpringHttpSession
        public static class MapSessionConfig {
            @Bean
            public SessionRepository<ExpiringSession> sessionRepository() {
                return new MapSessionRepository();
            }
        }
    }
    

    以下代码用于单元测试:

    @RunWith(SpringRunner.class)
    @TestPropertySource(properties = "testing=true")
    @SpringBootTest(classes = Application.class)
    public class MyTest {
    }
    
  • 3

    No direct solution but yes there is a work around ,比如下面的 Test 类:

    @SpringBootTest(classes = { ApplicationConfig.class })
    @RunWith(SpringJUnit4ClassRunner.class)
    @ActiveProfiles("integrationtests")
    public class SpringBootRedisApplicationTest {
    
        @Autowired
        private StudentRepository studentRepository;
    
        @Test
        public void test() {
        }
    
    }
    

    您可以使用所有配置创建Base类,如下所示:

    @Configuration
    @EnableWebMvc
    @ComponentScan(basePackages = { "com.spring.boot.redis.repository" })
    public class ApplicationConfig {
    
        @Bean
        public JedisConnectionFactory jedisConnFactory() {
            JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
            jedisConnectionFactory.setUsePool(true);
            jedisConnectionFactory.setHostName("localhost");
            jedisConnectionFactory.setPort(6379);
            return jedisConnectionFactory;
        }
    
        @SuppressWarnings("rawtypes")
        @Bean
        public RedisTemplate redisTemplate() {
            RedisTemplate redisTemplate = new RedisTemplate();
            redisTemplate.setConnectionFactory(jedisConnFactory());
            return redisTemplate;
        }
    
        @Bean
        public RedisHttpSessionConfiguration redisHttpSessionConfiguration() {
            return new RedisHttpSessionConfiguration();
        }
    }
    

    用于集成测试的子类没有 @EnableRedisHttpSession

    @Configuration
    @Profile({ "integrationtests", "unittest" })
    public class IntegrationTestConfig extends ApplicationConfig {
    
    }
    

    对于所有其他配置文件,如dev,staging和prod,另一个使用 @EnableRedisHttpSession ,类似于以下开发:

    @Profile({ "dev" })
    @Configuration
    @EnableRedisHttpSession
    public class DevConfig extends ApplicationConfig {
    
    }
    

    (可选)您可以将dev作为spring boot app的默认配置文件,在 application.properties 中指定 spring.profiles.active ,如下所示:

    spring.profiles.active=dev
    

    有关示例,您可以参考arpitaggarwal/spring-boot-redis

相关问题