嵌入式Redis服务器在Spring Boot测试中的使用教程


Posted in Redis onJuly 21, 2021

1、概述

Spring Data Redis提供了一种与Redis实例集成的简单方法。

但是,在某些情况下,使用嵌入式服务器比使用真实服务器创建开发和测试环境更方便。

因此,我们将学习如何设置和使用嵌入式Redis服务器。

2、依赖

让我们首先添加必要的依赖项:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
  <groupId>it.ozimov</groupId>
  <artifactId>embedded-redis</artifactId>
  <version>0.7.2</version>
  <scope>test</scope>
</dependency>

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test</artifactId>
  <scope>test</scope>
</dependency>

这个spring-boot-starter-test包含我们需要运行集成测试的各种依赖。

此外,embedded-redis包含我们将使用的嵌入式服务器。

3、设置

添加依赖项后,我们应该定义Redis服务器和我们的应用程序之间的连接设置。

让我们首先创建一个类来保存我们的属性:

@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
}

接下来,我们应该创建一个配置类来定义连接并使用我们的属性:

@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<byte[], byte[]> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        return template;
    }
}

配置非常简单。这样我们的嵌入式服务器可以在其他的端口上运行。

4、嵌入式Redis服务器

现在,我们将配置嵌入式服务器并在我们的一项测试中使用它。

首先,让我们在测试的资源目录(src/test/resources)中创建一个application.properties文件:

spring.redis.host=localhost
spring.redis.port=6370

之后,我们将创建一个@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();
    }
}

当context上下文启动,服务器就跟着启动。它根据我们在属性中定义的端口运行在我们的机器上。有了它,我们现在可以在不停止实际Redis服务器的情况下运行测试了。

理想情况下,我们希望在随机可用端口上启动它,但嵌入式Redis尚不具备此功能。我们现在可以做的是通过ServerSocket API 获取随机端口。

此外,当上下文停止,服务器也跟着停止。

服务器也可以由我们自己的可执行文件来提供:

this.redisServer = new RedisServer("/path/redis", redisProperties.getRedisPort());

此外,可执行文件可以按不同的操作系统来定义:

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());

最后,让我们创建一个使用TestRedisConfiguration类的测试吧:

@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);
    }
}

这样用户保存就到了我们的嵌入式Redis服务器。

此外,我们必须手动将TestRedisConfiguration添加到SpringBootTest。正如我们之前所说,服务器在测试之前启动并在测试之后停止。

5、结论

嵌入式Redis服务器是在测试环境中替换实际服务器的完美工具。我们已经看到了如何配置它以及如何在我们的测试中使用它。

到此这篇关于嵌入式Redis服务器在Spring Boot测试中的使用的文章就介绍到这了,更多相关Redis Spring Boot使用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
Redis5之后版本的高可用集群搭建的实现
Apr 27 Redis
redis客户端实现高可用读写分离的方式详解
Jul 04 Redis
Redis 常见使用场景
Aug 30 Redis
Redis中缓存穿透/击穿/雪崩问题和解决方法
Dec 04 Redis
浅谈Redis跟MySQL的双写问题解决方案
Feb 24 Redis
Redis 哨兵机制及配置实现
Mar 25 Redis
Redis如何实现验证码发送 以及限制每日发送次数
Apr 18 Redis
Redis 异步机制
May 15 Redis
浅谈Redis的事件驱动模型
May 30 Redis
Redis基本数据类型哈希Hash常用操作命令
Jun 01 Redis
Redis实战之Lettuce的使用技巧详解
Dec 24 Redis
Redis源码阅读:Redis字符串SDS详解
浅谈Redis位图(Bitmap)及Redis二进制中的问题
Redis做数据持久化的解决方案及底层原理
Jul 15 #Redis
Redis Cluster集群动态扩容的实现
redis requires ruby version2.2.2的解决方案
Jul 15 #Redis
厉害!这是Redis可视化工具最全的横向评测
Redis性能监控的实现
You might like
坏狼的PHP学习教程之第1天
2008/06/15 PHP
php面向对象全攻略 (八)重载新的方法
2009/09/30 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
详解PHP编码转换函数应用技巧
2016/10/22 PHP
php微信公众平台开发(三)订阅事件处理
2016/12/06 PHP
laravel 中某一字段自增、自减的例子
2019/10/11 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
拖拉表格的JS函数
2008/11/20 Javascript
javascript中比较字符串是否相等的方法
2013/07/23 Javascript
jQuery中hide()方法用法实例
2014/12/24 Javascript
简单介绍JavaScript的变量和数据类型
2015/06/03 Javascript
JQuery删除DOM节点的方法
2015/06/11 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
Angular中$cacheFactory的作用和用法实例详解
2016/08/19 Javascript
Vue.js实例方法之生命周期详解
2017/07/03 Javascript
解决vue build打包之后首页白屏的问题
2018/03/06 Javascript
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
学习React中ref的两个demo示例
2018/08/14 Javascript
JavaScript实现构造json数组的方法分析
2018/08/17 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
vue debug 二种方法
2018/09/16 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
通过JS深度判断两个对象字段相同
2019/06/14 Javascript
Javascript模拟实现new原理解析
2020/03/03 Javascript
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
python通过字典dict判断指定键值是否存在的方法
2015/03/21 Python
Request的中断和ErrorHandler实例解析
2018/02/12 Python
python 异或加密字符串的实例
2018/10/14 Python
python读取图片任意范围区域
2019/01/23 Python
通过实例了解python property属性
2019/11/01 Python
如何理解python面向对象编程
2020/06/01 Python
Clarisonic美国官网:科莱丽声波洁面仪
2017/10/12 全球购物
梅西百货官网:Macy’s
2020/08/04 全球购物
中间件的定义
2016/08/09 面试题
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
授权收款委托书
2014/09/23 职场文书