Serveur Redis intégré avec Spring Boot Test

1. Vue d'ensemble

Spring Data Redis offre un moyen facile d'intégrer les instances Redis.

Cependant, dans certains cas, il est plus pratique d'utiliser un serveur intégré que de créer un environnement avec un vrai serveur.

Par conséquent, nous allons apprendre à configurer et à utiliser le serveur Redis intégré.

2. Dépendances

Commençons par ajouter les dépendances nécessaires:

 org.springframework.boot spring-boot-starter-data-redis   it.ozimov embedded-redis 0.7.2 test   org.springframework.boot spring-boot-starter-test test 

La dépendance spring-boot-starter-test contient tout ce dont nous avons besoin pour exécuter des tests d'intégration.

De plus, le embedded-redis contient le serveur intégré que nous utiliserons.

3. Configuration

Après avoir ajouté les dépendances, nous devons définir les paramètres de connexion entre le serveur Redis et notre application.

Commençons par créer une classe qui contiendra nos propriétés:

@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 }

Ensuite, nous devons créer une classe de configuration qui définit la connexion et utilise nos propriétés:

@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; } }

La configuration est assez simple. De plus, cela nous permet d'exécuter le serveur intégré sur un port différent.

Consultez notre article Introduction à Spring Data Redis pour en savoir plus sur Redis avec Spring Boot.

4. Serveur Redis intégré

Nous allons maintenant configurer le serveur intégré et l'utiliser dans l'un de nos tests.

Tout d'abord, créons un fichier application.properties dans le répertoire des ressources de test ( src / test / resources):

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

Après cela, nous allons créer une classe annotée @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(); } }

Le serveur démarrera une fois le contexte activé. Il démarrera sur notre machine sur le port que nous avons défini dans nos propriétés . Par exemple, nous pouvons maintenant exécuter le test sans arrêter le serveur Redis réel.

Idéalement, nous aimerions le démarrer sur le port disponible aléatoire, mais Redis intégré n'a pas encore cette fonctionnalité. Ce que nous pourrions faire maintenant, c'est obtenir le port aléatoire via l'API ServerSocket.

De plus, le serveur s'arrêtera une fois le contexte détruit.

Le serveur peut également être fourni avec notre propre exécutable:

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

De plus, l'exécutable peut être défini par système d'exploitation:

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());

Enfin, créons un test qui utilisera notre classe 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); } }

L'utilisateur a été enregistré sur notre serveur Redis intégré.

De plus, nous avons dû ajouter manuellement TestRedisConfiguration à SpringBootTest. Comme nous l'avons dit précédemment, le serveur a démarré avant le test et s'est arrêté après.

5. Conclusion

Le serveur Redis intégré est l'outil idéal pour remplacer le serveur réel dans l'environnement de test. Nous avons vu comment le configurer et comment l'utiliser dans notre test.

Comme toujours, le code des exemples est disponible à l'adresse over sur GitHub.