Server Redis integrato con Spring Boot Test

1. Panoramica

Spring Data Redis fornisce un modo semplice per l'integrazione con le istanze Redis.

Tuttavia, in alcuni casi, è più conveniente utilizzare un server incorporato che creare un ambiente con un server reale.

Pertanto, impareremo come configurare e utilizzare il server Redis incorporato.

2. Dipendenze

Cominciamo aggiungendo le dipendenze necessarie:

 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 dipendenza spring-boot-starter-test contiene tutto ciò di cui abbiamo bisogno per eseguire i test di integrazione.

Inoltre, embedded-redis contiene il server incorporato che useremo.

3. Configurazione

Dopo aver aggiunto le dipendenze, dovremmo definire le impostazioni di connessione tra il server Redis e la nostra applicazione.

Cominciamo creando una classe che manterrà le nostre proprietà:

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

Successivamente, dovremmo creare una classe di configurazione che definisce la connessione e utilizza le nostre proprietà:

@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 configurazione è abbastanza semplice. Inoltre, ci consente di eseguire il server incorporato su una porta diversa.

Consulta il nostro articolo Introduzione a Spring Data Redis per ulteriori informazioni su Redis con Spring Boot.

4. Server Redis incorporato

Ora configureremo il server incorporato e lo useremo in uno dei nostri test.

Per prima cosa, creiamo un file application.properties nella directory delle risorse di test ( src / test / resources):

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

Dopodiché, creeremo una classe annotata con @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(); } }

Il server verrà avviato una volta che il contesto è attivo. Inizierà sulla nostra macchina sulla porta che abbiamo definito nelle nostre proprietà . Ad esempio, ora possiamo eseguire il test senza arrestare il server Redis effettivo.

Idealmente, vorremmo avviarlo sulla porta disponibile casuale, ma Redis incorporato non ha ancora questa funzione. Quello che potremmo fare adesso è ottenere la porta casuale tramite l'API ServerSocket.

Inoltre, il server si arresterà una volta che il contesto viene distrutto.

Il server può anche essere fornito con il nostro eseguibile:

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

Inoltre, l'eseguibile può essere definito per sistema operativo:

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

Infine, creiamo un test che utilizzerà la nostra 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'utente è stato salvato sul nostro server Redis incorporato.

Inoltre, abbiamo dovuto aggiungere manualmente TestRedisConfiguration a SpringBootTest . Come abbiamo detto prima, il server è stato avviato prima del test e si è fermato dopo.

5. conclusione

Embedded Redis Server è lo strumento perfetto per sostituire il server effettivo nell'ambiente di test. Abbiamo visto come configurarlo e come usarlo nel nostro test.

Come sempre, il codice per gli esempi è disponibile su GitHub.