J'exécute mes cas de test d'intégration avec Spring Boot avec l'aide de mon serveur Redis local sur ma machine.
Mais je veux un serveur Redis intégré qui ne dépend d'aucun serveur et puisse fonctionner sur n'importe quel environnement, comme la base de données H2 en mémoire. Comment puis-je le faire?
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@IntegrationTest("server.port:0")
@SpringApplicationConfiguration(classes = Application.class)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class MasterIntegrationTest {
}
Vous pouvez utiliser un Redis intégré comme https://github.com/kstyrc/embedded-redis
Ajustez les propriétés de votre test d'intégration pour pointer vers votre redis intégré, par exemple:
spring:
redis:
Host: localhost
port: 6379
Instanciez le serveur Redis intégré dans un composant défini dans vos tests uniquement:
@Component
public class EmbededRedis {
@Value("${spring.redis.port}")
private int redisPort;
private RedisServer redisServer;
@PostConstruct
public void startRedis() throws IOException {
redisServer = new RedisServer(redisPort);
redisServer.start();
}
@PreDestroy
public void stopRedis() {
redisServer.stop();
}
}
Vous pouvez utiliser ozimov/embedded-redis comme une dépendance Maven (-test) (c'est le successeur de kstyrc/embedded-redis ).
Ajoutez la dépendance à votre pom.xml
<dependencies>
...
<dependency>
<groupId>it.ozimov</groupId>
<artifactId>embedded-redis</artifactId>
<version>0.7.1</version>
<scope>test</scope>
</dependency>
Ajustez les propriétés de votre application pour votre test d'intégration
spring.redis.Host=localhost
spring.redis.port=6379
Utilisez le serveur redis intégré dans un configuration de test
@TestConfiguration
public static class EmbededRedisTestConfiguration {
private final redis.embedded.RedisServer redisServer;
public EmbededRedisTestConfiguration(@Value("${spring.redis.port}") final int redisPort) throws IOException {
this.redisServer = new redis.embedded.RedisServer(redisPort);
}
@PostConstruct
public void startRedis() {
this.redisServer.start();
}
@PreDestroy
public void stopRedis() {
this.redisServer.stop();
}
}
Une autre façon intéressante est d'utiliser la bibliothèque testcontainers
qui peut exécuter n'importe quel type d'application qui peut dans un conteneur Docker et Redis ne fait pas exception. Ce que j'aime le plus, c'est qu'il est légèrement couplé avec l'écosystème Spring Test.
dépendance de maven:
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<version>${testcontainers.version}</version>
</dependency>
test d'intégration simple:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = {"management.port=0"})
@ContextConfiguration(initializers = AbstractIntegrationTest.Initializer.class)
@DirtiesContext
public abstract class AbstractIntegrationTest {
private static int REDIS_PORT = 6379;
@ClassRule
public static GenericContainer redis = new GenericContainer("redis:3.0.6").withExposedPorts(REDIS_PORT);
public static class Initializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext ctx) {
// Spring Boot 1.5.x
TestPropertySourceUtils.addInlinedPropertiesToEnvironment(ctx,
"spring.redis.Host=" + redis.getContainerIpAddress(),
"spring.redis.port=" + redis.getMappedPort(REDIS_PORT));
// Spring Boot 2.x.
TestPropertyValues.of(
"spring.redis.Host:" + redis.getContainerIpAddress(),
"spring.redis.port:" + redis.getMappedPort(REDIS_PORT))
.applyTo(ctx);
}
}
}
vous pouvez voir ce référentiel: https://github.com/caryyu/spring-embedded-redis-server , entièrement intégré à Spring et Spring Boot
<dependency>
<groupId>com.github.caryyu</groupId>
<artifactId>spring-embedded-redis-server</artifactId>
<version>1.1</version>
</dependency>
@Bean
public RedisServerConfiguration redisServerConfiguration() {
return new RedisServerConfiguration();
}
spring:
redis:
port: 6379
embedded: true