web-dev-qa-db-fra.com

Redis intégré pour Spring Boot

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 {

}
26
Gurinder

Vous pouvez utiliser un Redis intégré comme https://github.com/kstyrc/embedded-redis

  1. Ajoutez la dépendance à votre pom.xml
  2. 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
    
  3. 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();
        }
    }
    
42

Vous pouvez utiliser ozimov/embedded-redis comme une dépendance Maven (-test) (c'est le successeur de kstyrc/embedded-redis ).

  1. 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>
    
  2. Ajustez les propriétés de votre application pour votre test d'intégration

    spring.redis.Host=localhost
    spring.redis.port=6379
    
  3. 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();
      }
    }
    
19
Markus Schulte

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);
        }
    }
}
5
magiccrafter

vous pouvez voir ce référentiel: https://github.com/caryyu/spring-embedded-redis-server , entièrement intégré à Spring et Spring Boot

dépendance maven

<dependency>
<groupId>com.github.caryyu</groupId>
<artifactId>spring-embedded-redis-server</artifactId>
<version>1.1</version>
</dependency>

annotation de démarrage à ressort

@Bean
public RedisServerConfiguration redisServerConfiguration() {
return new RedisServerConfiguration();
}

utilisation de application.yml

spring:
    redis:
        port: 6379
        embedded: true
2
Caryyu