嵌入式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 相关文章推荐
在K8s上部署Redis集群的方法步骤
Apr 27 Redis
Redis 配置文件重要属性的具体使用
May 20 Redis
SpringBoot 集成Redis 过程
Jun 02 Redis
解析高可用Redis服务架构分析与搭建方案
Jun 20 Redis
聊一聊Redis与MySQL双写一致性如何保证
Jun 26 Redis
浅谈Redis位图(Bitmap)及Redis二进制中的问题
Jul 15 Redis
Redis源码阅读:Redis字符串SDS详解
Jul 15 Redis
Jedis操作Redis实现模拟验证码发送功能
Sep 25 Redis
详解Redis在SpringBoot工程中的综合应用
Oct 16 Redis
Redis 持久化 RDB 与 AOF的执行过程
Nov 07 Redis
Redis之RedisTemplate配置方式(序列和反序列化)
Mar 13 Redis
Redis集群节点通信过程/原理流程分析
Mar 18 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
Zend的AutoLoad机制介绍
2012/09/27 PHP
PHP模板引擎Smarty中的保留变量用法分析
2016/04/11 PHP
php实现给二维数组中所有一维数组添加值的方法
2017/02/04 PHP
JQUERY操作JSON实例代码
2010/02/09 Javascript
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
JqGrid web打印实现代码
2011/05/31 Javascript
js innerHTML 改变div内容的方法
2013/08/03 Javascript
Javascript基础教程之数据类型 (布尔型 Boolean)
2015/01/18 Javascript
js实现用户注册协议倒计时的方法
2015/01/21 Javascript
javascript 动态创建表格的2种方法总结
2015/03/04 Javascript
深入分析Javascript跨域问题
2015/04/17 Javascript
PHP结合jQuery实现红蓝投票功能特效
2015/07/22 Javascript
轻松掌握JavaScript单例模式
2016/08/25 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
vue实现在一个方法执行完后执行另一个方法的示例
2018/08/25 Javascript
mpvue中使用flyjs全局拦截的实现代码
2018/09/13 Javascript
JavaScript 九种跨域方式实现原理
2019/02/11 Javascript
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
利用Python中的mock库对Python代码进行模拟测试
2015/04/16 Python
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
Python去除字符串前后空格的几种方法
2019/03/04 Python
Django框架实现的分页demo示例
2019/05/25 Python
python 画出使用分类器得到的决策边界
2019/08/21 Python
pytorch:model.train和model.eval用法及区别详解
2020/02/20 Python
django 获取字段最大值,最新的记录操作
2020/08/09 Python
阿里旅行:飞猪
2017/01/05 全球购物
Skyscanner阿联酋:全球领先的旅游搜索平台
2017/11/25 全球购物
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
如何在Oracle中查看各个表、表空间占用空间的大小
2015/10/31 面试题
抽象类和接口的区别
2012/09/19 面试题
C#软件工程师英语面试题
2015/06/07 面试题
电气自动化自荐信
2013/10/10 职场文书
大学本科毕业生求职信范文
2013/12/18 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书