java - 在集成测试中使用 redis 禁用 spring session

标签 java spring redis spring-session spring-data-redis

我正在将 spring session 与 redis 一起使用,但我想在进行测试时禁用它。我的课有注释:

@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 测试工作,但当然我不想保持这种状态; )

//更新

我一直在尝试

@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

最佳答案

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

使用以下代码进行 session 配置:

@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 {
}

关于java - 在集成测试中使用 redis 禁用 spring session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41827657/

相关文章:

java - setPreferredSize 未按预期工作,JPanel 不是 "packing"

java - 在Java中搜索字符串中的一组字符串的有效方法

java - 可编辑的 JTableHeader

java - Spring ModelAttribute 注销后显示旧值

mysql - Spring Data REST持久化MySQL一对多内嵌对象更新(PUT/PATCH)

带有帐户合并错误的 Meteor redis-oplog

java - Byte Buddy 示例中的“getClass()”

spring - 如何在 Spring 启动期间生成 HttpServletRequest 以进行 bean 初始化?

Redis 客户端 Lettuce 命令超时与套接字超时

redis - 如果您只需要不到 5MB 的存储空间,为什么要使用 redis 而不是 localStorage?