Java 在integrationtests中禁用与redis的spring会话
我正在用redis使用spring会话,但我想在进行测试时禁用它。我的班级被标注为:Java 在integrationtests中禁用与redis的spring会话,java,spring,redis,spring-session,spring-data-redis,Java,Spring,Redis,Spring Session,Spring Data Redis,我正在用redis使用spring会话,但我想在进行测试时禁用它。我的班级被标注为: @ActiveProfiles("integrationtests") 我的application-integrationtests.tml文件包含: spring.autoconfigure.exclude: org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration 但它仍然在以下方面失败: Caused by: or
@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
Error creating bean with name 'redisMessageListenerContainer' defined in class path resource [org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.class]
如果我打开redis服务器,测试就会起作用,但我当然不想保持这种状态;)
//更新
我一直在试着
@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);
}
}
但它在以下方面失败了:
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
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
没有直接的解决方案,但有一个解决办法,比如下面的测试
类:
@SpringBootTest(classes = { ApplicationConfig.class })
@RunWith(SpringJUnit4ClassRunner.class)
@ActiveProfiles("integrationtests")
public class SpringBootRedisApplicationTest {
@Autowired
private StudentRepository studentRepository;
@Test
public void test() {
}
}
您可以使用所有配置创建基类,如下所示:
@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 {
}
另一个配置文件具有@EnableRedisHttpSession
,用于所有其他配置文件,如dev、staging和prod,类似于下面的dev:
@Profile({ "dev" })
@Configuration
@EnableRedisHttpSession
public class DevConfig extends ApplicationConfig {
}
或者,您可以在application.properties
中指定spring.profiles.active
使dev成为spring boot应用程序的默认配置文件,如下所示:
spring.profiles.active=dev
例如,您可以参考我在测试时用于解决此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();
}
}
}
创建特定于“测试”概要文件的yml(application test.yml)
测试类应该有注释
@ActiveProfiles("test")
明天我将尝试,在我的评论(最后一条)中提供更多信息:-即使将RedisHttpSessionConfiguration添加到排除的类中,它也会失败,并在该类中出现“UnsatifiedPendencyException”:“不,它没有帮助,我添加了@EnableAutoConfiguration(排除={SessionAutoConfiguration.class,RedisAutoConfiguration.class,RedisHttpSessionConfiguration.class}@ActiveProfiles(“integrationtests”)仍然失败,现在出现以下错误:在类路径资源中定义了名为“enableRedisKeyspaceNotificationsInitializer”的bean创建错误[org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.class]:@Arpit Hi Arpit我是Redis的新手,你能解释一下如何将Redis与spring boot集成吗?我们需要手动安装Redis吗?或者在POM中只安装依赖项就足够了。我的解决方法如下:,但主要问题仍然存在-为什么排除Redis类而不排除它们?:)知道总是有Redis实例是很困难的在测试期间,我建议您为您的测试用例使用此属性
spring.session.store type=hash_map
,此属性应为spring.session.store type=none
,位于测试应用程序.properties