Servidor Redis incorporado com teste de inicialização por mola
1. Visão geral
O Spring Data Redis fornece uma maneira fácil de integração com instâncias deRedis.
No entanto, em alguns casos,it’s more convenient to use an embedded server than to create an environment with a real server.
Portanto, aprenderemos como configurar e usar o servidor Redis incorporado.
2. Dependências
Vamos começar adicionando as dependências necessárias:
org.springframework.boot
spring-boot-starter-data-redis
it.ozimov
embedded-redis
0.7.2
test
org.springframework.boot
spring-boot-starter-test
test
A dependênciaspring-boot-starter-test contém tudo o que precisamos para executar os testes de integração.
Além disso, oembedded-redis contém o servidor integrado que usaremos.
3. Configuração
Após adicionar as dependências, devemos definir as configurações de conexão entre o servidor Redis e nosso aplicativo.
Vamos começar criando uma classe que conterá nossas propriedades:
@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
}
Em seguida, devemos criar uma classe de configuração que defina a conexão e use nossas propriedades:
@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;
}
}
A configuração é bastante simples. Além disso, ele nos permite executar o servidor incorporado em uma porta diferente.
Confira nosso artigoIntroduction to Spring Data Redis para saber mais sobre o Redis com Spring Boot.
4. Servidor Redis incorporado
Agora, vamos configurar o servidor incorporado e usá-lo em um de nossos testes.
Em primeiro lugar, vamos criar um arquivoapplication.properties no diretório de recursos de teste (src/test/resources):
spring.redis.host=localhost
spring.redis.port=6370
Depois disso, vamos criar uma classe anotada@TestConfiguration:
@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();
}
}
The server will start once the context is up. It’ll start on our machine on the port that we’ve defined in our properties. Por exemplo, agora podemos executar o teste sem parar o servidor Redis real.
Idealmente, gostaríamos de iniciá-lo na porta disponível aleatória, mas o Redis incorporado ainda não tem esse recurso. O que poderíamos fazer agora é obter a porta aleatória por meio da API ServerSocket.
Além disso, o servidor será interrompido assim que o contexto for destruído.
O servidor também pode ser fornecido com nosso próprio executável:
this.redisServer = new RedisServer("/path/redis", redisProperties.getRedisPort());
Além disso, o executável pode ser definido por sistema operacional:
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());
Finalmente, vamos criar um teste que usará nossa classeTestRedisConfiguration:
@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);
}
}
O usuário foi salvo no nosso servidor Redis incorporado.
Além disso, tivemos que adicionar manualmenteTestRedisConfiguration toSpringBootTest. Como dissemos anteriormente, o servidor iniciou antes do teste e parou depois.
5. Conclusão
O Embedded Redis Server é a ferramenta perfeita para substituir o servidor real no ambiente de teste. Vimos como configurá-lo e como usá-lo em nosso teste.
Como sempre, o código para exemplos está disponívelover on GitHub.