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 - 如何在java中填充多边形?

java - 编译错误 - 组合变量

spring - com.fasterxml.jackson.databind.exc.MismatchedInputException : Unexpected token

java - 没有 web 的 Spring Java 异常监听器

java - 如何在线程安全模式下以特定编号在Redis中启动计数器?

c# - stackexchange redis hashscan一次性返回所有字段

mysql - 我应该实现自己的缓存还是依赖只读副本?

java - 作为线程启动 Activity ?

java - MQ异步处理、聚合和发布数据

spring - 找不到参数的方法 springBoot() - 使用 Kotlin 的 Spring Boot