Redis incorporado para o arranque de molas

Executei os meus testes de integração com o Spring Boot com a ajuda do servidor Redis na minha máquina.

mas quero um servidor Redis incorporado que não dependa de nenhum servidor e possa correr em qualquer ambiente, como a base de dados H2 na memória. Como posso fazê-lo?

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@IntegrationTest("server.port:0")
@SpringApplicationConfiguration(classes = Application.class) 
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public class MasterIntegrationTest {

}
Author: informatik01, 2015-09-11

4 answers

Podes usar um Redis incorporado como https://github.com/kstyrc/embedded-redis

  1. Adicione a dependência ao seu pom.xml
  2. Ajuste as propriedades para o seu teste de integração para apontar para o seu redis incorporado, por exemplo:

    spring:
      redis:
        host: localhost
        port: 6379
    
  3. Instanciar o servidor Redis incorporado num componente definido apenas nos seus testes:

    @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();
        }
    }
    
 47
Author: Sébastien Nussbaumer, 2016-01-12 08:10:20

Pode usar ozimov / embedded-redis como uma dependência de Maven (- test) (Este é o sucessor de kstyrc/embed-redis).

  1. Adicione a dependência ao seu pom.xml

    <dependencies>
      ...
      <dependency>
        <groupId>it.ozimov</groupId>
        <artifactId>embedded-redis</artifactId>
        <version>0.7.1</version>
        <scope>test</scope>
      </dependency>
    
  2. Ajuste as propriedades da sua aplicação para o teste de integração

    spring.redis.host=localhost
    spring.redis.port=6379
    
  3. Usar o servidor Redis incorporado numa configuração de teste

    @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();
      }
    }
    
 23
Author: Markus Schulte, 2017-11-30 09:53:57

Outra maneira legal é usar a biblioteca testcontainers que pode executar qualquer tipo de aplicação que pode em um recipiente de Docker e Redis não é exceção. O que eu mais gosto é que ele é levemente acoplado com o ecossistema de Teste De Primavera.

A dependência de Maven:
<dependency>
    <groupId>org.testcontainers</groupId>
    <artifactId>testcontainers</artifactId>
    <version>${testcontainers.version}</version>
</dependency>

Teste de integração simples:

@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:5-alpine").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);
        }
    }
}

Desde A Mola 5.2.5 (Bota De Mola 2.3.x) você pode usar a anotação DynamicPropertySource poderosa. Aqui está um exemplo:

@ExtendWith(SpringExtension.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_CLASS)
public abstract class AbstractIT {

    static GenericContainer redisContainer = new GenericContainer("redis:5-alpine").withExposedPorts(6379);

    @DynamicPropertySource
    static void properties(DynamicPropertyRegistry r) throws IOException {
        r.add("spring.redis.host", redisContainer::getContainerIpAddress);
        r.add("spring.redis.port", redisContainer::getFirstMappedPort);
    }
}
 7
Author: magiccrafter, 2020-10-07 09:50:12

Você pode ver este repositório: https://github.com/caryyu/spring-embedded-redis-server , totalmente integrado com as botas de mola e mola

Dependência de Maven

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

Anotação de arranque de molas

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

Utilização da aplicação.yml

spring:
    redis:
        port: 6379
        embedded: true
 1
Author: Cary Yu, 2018-03-20 02:02:00