Spring 与 redis 的会话 - 如何在集成测试中模拟它?
Spring session with redis - how to mock it in integration tests?
所以,我在我的项目中使用 spring 会话。
如何使用它在项目中编写集成测试?我应该为 spring 会话内部模拟一些东西吗?或者有什么合理的方式来使用嵌入式redis?
我看到过去有一些@EnableEmbeddedRedis 注释,但似乎已被删除:https://github.com/spring-projects/spring-session/issues/248
//编辑
我试过将 MockHttpSession 传递给
mockMvc.perform(post("/register").session(mockHttpSession)
但是 spring 无论如何都尝试连接到 redis 但失败了。
好的,我刚刚在我的集成测试中使用配置文件禁用了 redis
@ActiveProfiles("integrationtests")
class RegisterControllerTest extends Specification {...
并将@EnableRedisHttpSession 提取到它自己的 class:
@Configuration
@EnableRedisHttpSession
@Profile("!integrationtests")
public class RedisConfig {
}
它更像是解决方法而不是解决方案,但我不需要在会话中测试任何东西。
您可以创建自己的连接工厂和再分发程序。然后 spring boot 将不会创建它们的默认 bean。
示例:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class ApplicationTest
{
@Test
public void contextLoads()
{
}
@EnableRedisHttpSession
@Configuration
static class Config
{
@Bean
@SuppressWarnings("unchecked")
public RedisSerializer<Object> defaultRedisSerializer()
{
return Mockito.mock(RedisSerializer.class);
}
@Bean
public RedisConnectionFactory connectionFactory()
{
RedisConnectionFactory factory = Mockito.mock(RedisConnectionFactory.class);
RedisConnection connection = Mockito.mock(RedisConnection.class);
Mockito.when(factory.getConnection()).thenReturn(connection);
return factory;
}
}
}
这项工作:
在您的 HttpSessionConfig 中定义激活配置的配置文件:
@EnableRedisHttpSession
@Profile("prod")
class HttpSessionConfig {
}
在申请中-prod.properties添加:
#REDIS SERVER
spring.redis.host=xxxxxxxx
然后在您的 application.properties 测试中添加:
#REDIS SERVER
spring.data.redis.repositories.enabled=false
spring.session.store-type=none
我不建议使用 mockHttpSession,因为它会绕过测试中与 spring-session 库的集成。我会
@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class ExampleControllerV2SpringSessionTest {
@Autowired
private WebApplicationContext wac;
@Autowired
private SessionRepository sessionRepository;
@Autowired
private SessionRepositoryFilter sessionRepositoryFilter;
//this is needed to test spring-session specific features
private MockMvc mockMvcWithSpringSession;
@Before
public void setup() throws URISyntaxException {
this.mockMvcWithSpringSession = MockMvcBuilders
.webAppContextSetup(wac)
.addFilter(sessionRepositoryFilter)
.build();
}
}
知道在测试期间很难始终准备好 redis 实例,我建议您将此 属性 spring.session.store-type=hash_map
用于您的测试用例。
所以,我在我的项目中使用 spring 会话。 如何使用它在项目中编写集成测试?我应该为 spring 会话内部模拟一些东西吗?或者有什么合理的方式来使用嵌入式redis?
我看到过去有一些@EnableEmbeddedRedis 注释,但似乎已被删除:https://github.com/spring-projects/spring-session/issues/248
//编辑
我试过将 MockHttpSession 传递给
mockMvc.perform(post("/register").session(mockHttpSession)
但是 spring 无论如何都尝试连接到 redis 但失败了。
好的,我刚刚在我的集成测试中使用配置文件禁用了 redis
@ActiveProfiles("integrationtests")
class RegisterControllerTest extends Specification {...
并将@EnableRedisHttpSession 提取到它自己的 class:
@Configuration
@EnableRedisHttpSession
@Profile("!integrationtests")
public class RedisConfig {
}
它更像是解决方法而不是解决方案,但我不需要在会话中测试任何东西。
您可以创建自己的连接工厂和再分发程序。然后 spring boot 将不会创建它们的默认 bean。
示例:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class ApplicationTest
{
@Test
public void contextLoads()
{
}
@EnableRedisHttpSession
@Configuration
static class Config
{
@Bean
@SuppressWarnings("unchecked")
public RedisSerializer<Object> defaultRedisSerializer()
{
return Mockito.mock(RedisSerializer.class);
}
@Bean
public RedisConnectionFactory connectionFactory()
{
RedisConnectionFactory factory = Mockito.mock(RedisConnectionFactory.class);
RedisConnection connection = Mockito.mock(RedisConnection.class);
Mockito.when(factory.getConnection()).thenReturn(connection);
return factory;
}
}
}
这项工作:
在您的 HttpSessionConfig 中定义激活配置的配置文件:
@EnableRedisHttpSession
@Profile("prod")
class HttpSessionConfig {
}
在申请中-prod.properties添加:
#REDIS SERVER
spring.redis.host=xxxxxxxx
然后在您的 application.properties 测试中添加:
#REDIS SERVER
spring.data.redis.repositories.enabled=false
spring.session.store-type=none
我不建议使用 mockHttpSession,因为它会绕过测试中与 spring-session 库的集成。我会
@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
public class ExampleControllerV2SpringSessionTest {
@Autowired
private WebApplicationContext wac;
@Autowired
private SessionRepository sessionRepository;
@Autowired
private SessionRepositoryFilter sessionRepositoryFilter;
//this is needed to test spring-session specific features
private MockMvc mockMvcWithSpringSession;
@Before
public void setup() throws URISyntaxException {
this.mockMvcWithSpringSession = MockMvcBuilders
.webAppContextSetup(wac)
.addFilter(sessionRepositoryFilter)
.build();
}
}
知道在测试期间很难始终准备好 redis 实例,我建议您将此 属性 spring.session.store-type=hash_map
用于您的测试用例。