Embedded Redis Server mit Spring Boot Test

1. Übersicht

Spring Data Redis bietet eine einfache Möglichkeit zur Integration in Redis-Instanzen.

In einigen Fällen ist es jedoch bequemer, einen eingebetteten Server zu verwenden, als eine Umgebung mit einem echten Server zu erstellen.

Daher lernen wir, wie Sie den Embedded Redis Server einrichten und verwenden.

2. Abhängigkeiten

Beginnen wir mit dem Hinzufügen der erforderlichen Abhängigkeiten:

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

Die Spring-Boot-Starter-Test- Abhängigkeit enthält alles, was wir zum Ausführen von Integrationstests benötigen.

Darüber hinaus enthält das Embedded-Redis den Embedded-Server, den wir verwenden werden.

3. Setup

Nach dem Hinzufügen der Abhängigkeiten sollten wir die Verbindungseinstellungen zwischen dem Redis-Server und unserer Anwendung definieren.

Beginnen wir mit der Erstellung einer Klasse, die unsere Eigenschaften enthält:

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

Als Nächstes sollten wir eine Konfigurationsklasse erstellen, die die Verbindung definiert und unsere Eigenschaften verwendet:

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

Die Konfiguration ist recht einfach. Darüber hinaus können wir den eingebetteten Server an einem anderen Port ausführen.

Weitere Informationen zu Redis mit Spring Boot finden Sie in unserem Artikel Einführung in Spring Data Redis.

4. Embedded Redis Server

Jetzt konfigurieren wir den eingebetteten Server und verwenden ihn in einem unserer Tests.

Lassen Sie uns zunächst eine application.properties- Datei im Testressourcenverzeichnis ( src / test / resources) erstellen :

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

Danach erstellen wir eine @ TestConfiguration-annotierte Klasse:

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

Der Server wird gestartet, sobald der Kontext aktiv ist. Es wird auf unserem Computer an dem Port gestartet, den wir in unseren Eigenschaften definiert haben . Zum Beispiel können wir den Test jetzt ausführen, ohne den eigentlichen Redis-Server anzuhalten.

Idealerweise möchten wir es über den zufällig verfügbaren Port starten, aber Embedded Redis verfügt noch nicht über diese Funktion. Was wir jetzt tun könnten, ist, den zufälligen Port über die ServerSocket-API abzurufen.

Außerdem wird der Server angehalten, sobald der Kontext zerstört ist.

Der Server kann auch mit unserer eigenen ausführbaren Datei versehen werden:

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

Darüber hinaus kann die ausführbare Datei pro Betriebssystem definiert werden:

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

Zuletzt erstellen wir einen Test, der unsere TestRedisConfiguration- Klasse verwendet:

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

Der Benutzer wurde auf unserem eingebetteten Redis-Server gespeichert.

Darüber hinaus mussten wir manuell hinzufügen TestRedisConfiguration zu SpringBootTest. Wie bereits erwähnt, wurde der Server vor dem Test gestartet und danach gestoppt.

5. Schlussfolgerung

Der Embedded Redis Server ist das perfekte Tool, um den eigentlichen Server in der Testumgebung zu ersetzen. Wir haben gesehen, wie man es konfiguriert und wie man es in unserem Test verwendet.

Wie immer ist der Code für Beispiele auf GitHub verfügbar.