Indlejret Redis-server med Spring Boot-test

1. Oversigt

Spring Data Redis giver en nem måde at integrere med Redis-forekomster på.

I nogle tilfælde det er mere praktisk at bruge en integreret server end at skabe et miljø med en rigtig server.

Derfor lærer vi, hvordan du opsætter og bruger den integrerede Redis-server.

2. Afhængigheder

Lad os begynde med at tilføje de nødvendige afhængigheder:

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

Det spring-boot-starter-test afhængighed indeholder alt hvad vi har brug for til at køre integrationstest.

Derudover er embedded-redis indeholder den integrerede server, som vi bruger.

3. Opsætning

Efter tilføjelse af afhængigheder skal vi definere forbindelsesindstillingerne mellem Redis-serveren og vores applikation.

Lad os begynde med at oprette en klasse, der indeholder vores egenskaber:

@Configuration offentlig klasse RedisProperties {private int redisPort; private String redisHost; offentlige RedisProperties (@Value ("$ {spring.redis.port}") int redisPort, @Value ("$ {spring.redis.host}") String redisHost) {this.redisPort = redisPort; this.redisHost = redisHost; } // getters}

Dernæst skal vi oprette en konfigurationsklasse, der definerer forbindelsen og bruger vores egenskaber:

@Configuration @EnableRedisRepositories offentlig klasse RedisConfiguration {@Bean public LettuceConnectionFactory redisConnectionFactory (RedisProperties redisProperties) {returner ny LettuceConnectionFactory (redisProperties.getRedisHost (), redisProperties.getRis; } @Bean offentlig RedisTemplate redisTemplate (LettuceConnectionFactory connectionFactory) {RedisTemplate skabelon = ny RedisTemplate (); template.setConnectionFactory (connectionFactory); returskabelon; }}

Konfigurationen er ret enkel. Derudover giver det os mulighed for at køre den integrerede server på en anden port.

Se vores introduktion til Spring Data Redis-artikel for at lære mere om Redis med Spring Boot.

4. Indlejret Redis-server

Nu konfigurerer vi den integrerede server og bruger den i en af ​​vores tests.

Lad os først oprette en application.properties fil i testressourcebiblioteket (src / test / ressourcer):

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

Derefter opretter vi en @TestConfiguration-anmeldt klasse:

@TestConfiguration offentlig klasse TestRedisConfiguration {privat RedisServer redisServer; offentlig TestRedisConfiguration (RedisProperties redisProperties) {this.redisServer = ny RedisServer (redisProperties.getRedisPort ()); } @ PostConstruct offentlig ugyldig postConstruct () {redisServer.start (); } @ PreDestroy offentlig ugyldighed preDestroy () {redisServer.stop (); }}

Serveren starter, når konteksten er op. Det starter på vores maskine på den port, som vi har defineret i vores egenskaber. For eksempel kan vi nu køre testen uden at stoppe den aktuelle Redis-server.

Ideelt set vil vi gerne starte den på den tilfældige tilgængelige port, men indlejret Redis har ikke denne funktion endnu. Hvad vi kunne gøre lige nu er at få den tilfældige port via ServerSocket API.

Derudover stopper serveren, når konteksten er ødelagt.

Serveren kan også forsynes med vores egen eksekverbare:

this.redisServer = ny RedisServer ("/ sti / redis", redisProperties.getRedisPort ());

Desuden kan den eksekverbare defineres pr. Operativsystem:

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 = ny RedisServer (customProvider, redisProperties.getRedisPort ());

Lad os endelig oprette en test, der bruger vores TestRedisConfiguration klasse:

@RunWith (SpringRunner.class) @SpringBootTest (klasser = TestRedisConfiguration.class) offentlig klasse UserRepositoryIntegrationTest {@Autowired privat UserRepository userRepository; @Test offentlig ugyldighed skalSaveUser_toRedis () {UUID id = UUID.randomUUID (); Brugerbruger = ny bruger (id, "navn"); Bruger gemt = userRepository.save (bruger); assertNotNull (gemt); }}

Brugeren er blevet gemt på vores integrerede Redis-server.

Derudover måtte vi tilføje manuelt TestRedisConfiguration til SpringBootTest. Som vi sagde tidligere, har serveren startet før testen og stoppet efter.

5. Konklusion

Den integrerede Redis-server er det perfekte værktøj til at erstatte den faktiske server i testmiljøet. Vi har set, hvordan vi konfigurerer det, og hvordan vi bruger det i vores test.

Som altid er koden til eksempler tilgængelig på GitHub.