Весенняя сессия с Redis — как издеваться над ней в интеграционных тестах?

Итак, я использую весеннюю сессию в своем проекте. Как с его помощью написать интеграционные тесты в проекте? Должен ли я издеваться над внутренними элементами весенней сессии? Или любой разумный способ использовать встроенный Redis?

Я видел, что в прошлом была аннотация @EnableEmbeddedRedis, но, кажется, она была удалена: https://github.com/spring-projects/spring-session/issues/248

//редактировать

Я пытался передать MockHttpSession в

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

но Spring все равно пытается и не может подключиться к Redis.


person freakman    schedule 08.10.2015    source источник


Ответы (4)


Вы можете создать свою собственную фабрику соединений и редиссериализатор. Тогда весенняя загрузка не будет создавать свои 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;
        }
    }
}
person Dmitriy Kosolobov    schedule 24.03.2016

хорошо, я только что отключил Redis, используя профили в моих интеграционных тестах

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

и извлечение @EnableRedisHttpSession в свой собственный класс:

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

}

Это больше похоже на обходной путь, чем на решение, но мне все равно не нужно ничего тестировать внутри сеанса.

person freakman    schedule 08.10.2015
comment
Просто примечание... Это не сработает, если вы используете Spring Boot. Spring Boot использует автоконфигурацию для установки соединения Redis (когда у вас есть повторная сессия в вашем пути к классам, Spring Boot ищет соединение Redis и терпит неудачу, если ничего не найдено). - person shobull; 04.04.2016
comment
это была весенняя загрузка, но версия ниже 1.4, может быть, даже ниже 1.3, в 1.4, как вы сказали, - выборка автоконфигурации в Redis. - person freakman; 25.01.2017

Я бы не советовал использовать 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 для ваших тестовых случаев.

person imarchuang    schedule 31.12.2017
comment
не было такой настройки, как spring.session.store-type=hash_map, когда задавался этот вопрос (было spring boot 1.3) - person Dmitriy Kosolobov; 29.06.2018

Эта работа:

В вашем 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
person Francisco Disalvo    schedule 02.08.2017