1. Обзор
Spring Data Redis предоставляет простой способ интеграции с экземплярами Redis .
Однако в некоторых случаях удобнее использовать встроенный сервер, чем создавать среду с реальным сервером.
Поэтому мы узнаем, как настроить и использовать встроенный сервер Redis.
2. Зависимости
Начнем с добавления необходимых зависимостей:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>it.ozimov</groupId>
<artifactId>embedded-redis</artifactId>
<version>0.7.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
Зависимость spring-boot-starter-test
содержит все необходимое для запуска интеграционных тестов.
Кроме того, embedded-redis
содержит встроенный сервер, который мы будем использовать.
3. Настройка
После добавления зависимостей мы должны определить параметры соединения между сервером Redis и нашим приложением.
Давайте начнем с создания класса, который будет содержать наши свойства:
@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<byte[], byte[]> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
return template;
}
}
Конфигурация довольно проста. Кроме того, это позволяет нам запускать встроенный сервер на другом порту.
Прочтите нашу статью « Введение в Spring Data Redis », чтобы узнать больше о Redis с Spring Boot.
4. Встроенный сервер Redis
Теперь мы настроим встроенный сервер и используем его в одном из наших тестов.
Во-первых, давайте создадим файл application.properties в каталоге тестовых ресурсов (
src/test/resources):
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());
Наконец, давайте создадим тест, который будет использовать наш класс TestRedisConfiguration
:
@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.
Кроме того, нам пришлось вручную добавить TestRedisConfiguration
в SpringBootTest.
Как мы уже говорили ранее, сервер стартовал до теста и остановился после.
5. Вывод
Встроенный сервер Redis — идеальный инструмент для замены реального сервера в тестовой среде. Мы видели, как его настроить и как использовать в нашем тесте.
Как всегда, код для примеров доступен на GitHub .