在集成测试中禁用带有 Redis 的 Spring 会话

fre*_*man 5 java spring redis spring-data-redis spring-session

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

@ActiveProfiles("integrationtests")
Run Code Online (Sandbox Code Playgroud)

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

spring.autoconfigure.exclude: org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration
Run Code Online (Sandbox Code Playgroud)

但它仍然失败:

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
Run Code Online (Sandbox Code Playgroud)

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

//更新

我一直在尝试

@SpringBootTest(classes = {Application.class})
@ActiveProfiles("integrationtests")
Run Code Online (Sandbox Code Playgroud)

和排除 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);
}
}
Run Code Online (Sandbox Code Playgroud)

但它失败了:

Error creating bean with name 'redisMessageListenerContainer' defined in class path resource [org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.class]
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Arp*_*wal 0

没有直接的解决方案,但有一个解决方法,例如Test下面的课程:

@SpringBootTest(classes = { ApplicationConfig.class })
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("integrationtests")
public class SpringBootRedisApplicationTest {

    @Autowired
    private StudentRepository studentRepository;

    @Test
    public void test() {
    }

}
Run Code Online (Sandbox Code Playgroud)

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

@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();
    }
}
Run Code Online (Sandbox Code Playgroud)

以及没有集成测试的子类@EnableRedisHttpSession

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

}
Run Code Online (Sandbox Code Playgroud)

另一个用于@EnableRedisHttpSession所有其他配置文件,如 dev、staging 和 prod,类似于下面的 dev:

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

}
Run Code Online (Sandbox Code Playgroud)

或者,您可以将 dev 设置为 spring boot 应用程序的默认配置文件,并spring.profiles.active在 中application.properties指定,如下所示:

spring.profiles.active=dev
Run Code Online (Sandbox Code Playgroud)

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