6

所以,我在我的项目中使用春季会议。如何使用它在项目中编写集成测试?我应该为春季会议内部嘲笑一些东西吗?或者任何合理的方式来使用嵌入式redis?

我看到过去有一些 @EnableEmbeddedRedis 注释,但似乎它已被删除:https ://github.com/spring-projects/spring-session/issues/248

//编辑

我试图将 MockHttpSession 传递给

mockMvc.perform(post("/register").session(mockHttpSession)

但是 spring 尝试并无法连接到 redis。

4

4 回答 4

10

您可以创建自己的 connectionfactory 和 redisserializer。然后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;
        }
    }
}
于 2016-03-24T15:05:39.180 回答
1

我不建议使用 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用于您的测试用例。

于 2017-12-31T01:42:30.423 回答
1

好的,我刚刚在集成测试中使用配置文件禁用了 redis

@ActiveProfiles("integrationtests")
class RegisterControllerTest extends Specification {...

并将@EnableRedisHttpSession 提取到它自己的类中:

@Configuration
@EnableRedisHttpSession
@Profile("!integrationtests")
public class RedisConfig {

}

它更像是解决方法而不是解决方案,但无论如何我都不需要在会话中测试任何东西。

于 2015-10-08T08:25:05.577 回答
0

这项工作:

在您的 HttpSessionConfig 中定义配置处于活动状态的配置文件:

@EnableRedisHttpSession
@Profile("prod")
class HttpSessionConfig {

}

在 application-prod.properties 添加:

#REDIS SERVER
spring.redis.host=xxxxxxxx

然后在您的 application.properties 测试中添加:

#REDIS SERVER
spring.data.redis.repositories.enabled=false
spring.session.store-type=none
于 2017-08-02T16:19:53.657 回答