Рубрики
Без рубрики

Встроенный сервер Redis с тестом весенней загрузки

Краткий и практический обзор использования встроенного Redis с пружинной загрузкой.

Автор оригинала: Łukasz Ryś.

1. Обзор

Spring Data Redis обеспечивает простой способ интеграции с экземплярами Redis .

Однако в некоторых случаях удобнее использовать встроенный сервер, чем создавать среду с реальным сервером.

Поэтому мы узнаем, как настроить и использовать встроенный сервер Redis.

2. Зависимости

Давайте начнем с добавления необходимых зависимостей:


  org.springframework.boot
  spring-boot-starter-data-redis



  it.ozimov
  embedded-redis
  0.7.2
  test



  org.springframework.boot
  spring-boot-starter-test
  test

Зависимость spring-boot-starter-test содержит все необходимое для запуска интеграционных тестов.

Кроме того, embedded-redis содержит встроенный сервер, который мы будем использовать.

3. Настройка

После добавления зависимостей мы должны определить параметры подключения между сервером Red is и нашим приложением.

Давайте начнем с создания класса, который будет содержать наши свойства:

@Configuration
public class RedisProperties {
    private int redisPort;
    private String redisHost;

    public RedisProperties(
      @Value("${spring.redis.port}") int redisPort, 
      @Value("${spring.redis.host}") String redisHost) {
        this.redisPort = redisPort;
        this.redisHost = redisHost;
    }

    // getters
}

Затем мы должны создать класс конфигурации, который определяет соединение и использует наши свойства:

@Configuration
@EnableRedisRepositories
public class RedisConfiguration {

    @Bean
    public LettuceConnectionFactory redisConnectionFactory(
      RedisProperties redisProperties) {
        return new LettuceConnectionFactory(
          redisProperties.getRedisHost(), 
          redisProperties.getRedisPort());
    }

    @Bean
    public RedisTemplate redisTemplate(LettuceConnectionFactory connectionFactory) {
        RedisTemplate template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        return template;
    }
}

Конфигурация довольно проста. Кроме того, это позволяет нам запускать встроенный сервер на другом порту.

Ознакомьтесь с нашей статьей Введение в Spring Data Redis, чтобы узнать больше о Red is с Spring Boot.

4. Встроенный Сервер Redis

Теперь мы настроим встроенный сервер и используем его в одном из наших тестов.

Во-первых, давайте создадим файл application.properties в каталоге ресурсов тестирования ( src/test/ресурсы):

spring.redis.host=localhost
spring.redis.port=6370

После этого мы создадим @TestConfiguration -аннотированный класс:

@TestConfiguration
public class TestRedisConfiguration {

    private RedisServer redisServer;

    public TestRedisConfiguration(RedisProperties redisProperties) {
        this.redisServer = new RedisServer(redisProperties.getRedisPort());
    }

    @PostConstruct
    public void postConstruct() {
        redisServer.start();
    }

    @PreDestroy
    public void preDestroy() {
        redisServer.stop();
    }
}

Сервер запустится, как только контекст будет поднят. Он запустится на нашей машине на порту, который мы определили в наших свойствах . Например, теперь мы можем запустить тест, не останавливая реальный сервер Redis.

В идеале мы хотели бы запустить его на случайном доступном порту, но встроенный Redis еще не имеет этой функции. Что мы могли бы сделать прямо сейчас, так это получить случайный порт через API ServerSocket.

Кроме того, сервер остановится, как только контекст будет уничтожен.

Сервер также может быть снабжен вашим собственным исполняемым файлом:

this.redisServer = new RedisServer("/path/redis", redisProperties.getRedisPort());

Кроме того, исполняемый файл может быть определен для каждой операционной системы:

RedisExecProvider customProvider = RedisExecProvider.defaultProvider()
  .override(OS.UNIX, "/path/unix/redis")
  .override(OS.Windows, Architecture.x86_64, "/path/windows/redis")
  .override(OS.MAC_OS_X, Architecture.x86_64, "/path/macosx/redis")
  
this.redisServer = new RedisServer(customProvider, redisProperties.getRedisPort());

Наконец, давайте создадим тест, который будет использовать нашу конфигурацию Test Redis класс:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = TestRedisConfiguration.class)
public class UserRepositoryIntegrationTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void shouldSaveUser_toRedis() {
        UUID id = UUID.randomUUID();
        User user = new User(id, "name");

        User saved = userRepository.save(user);

        assertNotNull(saved);
    }
}

Пользователь был сохранен на нашем встроенном сервере Redis.

Кроме того, нам пришлось вручную добавить Тестовую конфигурацию Redis в Весенний загрузочный тест. Как мы уже говорили ранее, сервер запустился до тестирования и остановился после.

5. Заключение

Встроенный сервер Redis является идеальным инструментом для замены реального сервера в тестовой среде. Мы видели, как его настроить и как использовать в нашем тесте.

Как всегда, код для примеров доступен на GitHub .