嵌入式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 相关文章推荐
redis配置文件中常用配置详解
Apr 14 Redis
Redis实现订单自动过期功能的示例代码
May 08 Redis
Redis Cluster 字段模糊匹配及删除
May 27 Redis
详解Redis基本命令与使用场景
Jun 01 Redis
解析高可用Redis服务架构分析与搭建方案
Jun 20 Redis
redis cluster支持pipeline的实现思路
Jun 23 Redis
聊一聊Redis与MySQL双写一致性如何保证
Jun 26 Redis
Redis集群新增、删除节点以及动态增加内存的方法
Sep 04 Redis
使用redis生成唯一编号及原理示例详解
Sep 15 Redis
SpringBoot集成Redis的思路详解
Oct 16 Redis
Redis 持久化 RDB 与 AOF的执行过程
Nov 07 Redis
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
Feb 12 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实现快钱支付功能(涉及到接口)
2013/07/01 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
简单JS代码压缩器
2006/10/12 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
2012/12/28 Javascript
下载文件个别浏览器文件名乱码解决办法
2013/03/19 Javascript
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
PHP abstract与interface之间的区别
2013/11/11 Javascript
javascript将url中的参数加密解密代码
2014/11/17 Javascript
jQuery实现径向动画菜单效果
2015/07/17 Javascript
js实现的后台左侧管理菜单代码
2015/09/11 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
2016/05/25 Javascript
基于Bootstrap的UI扩展 StyleBootstrap
2016/06/17 Javascript
详解nodejs操作mongodb数据库封装DB类
2017/04/10 NodeJs
详谈Angular 2+ 的表单(一)之模板驱动型表单
2017/04/25 Javascript
JS随机排序数组实现方法分析
2017/10/11 Javascript
jquery实现回车键触发事件(实例讲解)
2017/11/21 jQuery
从零开始搭建一个react项目开发
2018/02/09 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
[47:06]DOTA2上海特级锦标赛主赛事日 - 4 败者组第五轮 MVP.Phx VS EG第一局
2016/03/05 DOTA
Python datetime时间格式化去掉前导0
2014/07/31 Python
python的即时标记项目练习笔记
2014/09/18 Python
Python实现通过文件路径获取文件hash值的方法
2017/04/29 Python
通过实例解析Python return运行原理
2020/03/04 Python
pycharm下配置pyqt5的教程(anaconda虚拟环境下+tensorflow)
2020/03/25 Python
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
培训协议书范本
2014/04/22 职场文书
文明礼仪标语
2014/06/13 职场文书
大专生自荐书范文
2014/06/22 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
自查自纠工作总结
2014/10/15 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
2014年数学教师工作总结
2014/12/03 职场文书
新闻报道稿范文
2015/07/23 职场文书
Html5新增了哪些功能
2021/04/16 HTML / CSS
Three.js实现雪糕地球的使用示例详解
2022/07/07 Javascript