Вграден сървър Redis с тест за пролетно стартиране

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 

В пролетно-обувка стартер тест зависимостта съдържа всичко, което трябва да прави изследвания, за интеграция.

Освен това, 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 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.