Redis incorporado para o arranque de molas
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 {
}
4 answers
Podes usar um Redis incorporado como https://github.com/kstyrc/embedded-redis
- Adicione a dependência ao seu pom.xml
-
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
-
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(); } }
Pode usar ozimov / embedded-redis como uma dependência de Maven (- test) (Este é o sucessor de kstyrc/embed-redis).
-
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>
-
Ajuste as propriedades da sua aplicação para o teste de integração
spring.redis.host=localhost spring.redis.port=6379
-
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(); } }
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.
<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);
}
}
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