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 .