嵌入式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 相关文章推荐
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
May 21 Redis
Windows中Redis安装配置流程并实现远程访问功能
Jun 07 Redis
在redisCluster中模糊获取key方式
Jul 09 Redis
浅谈Redis的keys命令到底有多慢
Oct 05 Redis
Redis中有序集合的内部实现方式的详细介绍
Mar 16 Redis
解决redis批量删除key值的问题
Mar 23 Redis
Grafana可视化监控系统结合SpringBoot使用
Apr 19 Redis
Redis 报错 error:NOAUTH Authentication required
May 15 Redis
Redis基本数据类型哈希Hash常用操作命令
Jun 01 Redis
Redis唯一ID生成器的实现
Jul 07 Redis
Redis配置外网可访问(redis远程连接不上)的方法
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
40年前的这部特摄片恐龙特级克塞号80后的共同回忆
2020/03/08 日漫
php操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
Packer 3.0 JS压缩及混淆工具 下载
2007/05/03 Javascript
javascript 定义新对象方法
2010/02/20 Javascript
Javascript 面向对象 继承
2010/05/13 Javascript
Javascript 按位左移运算符使用介绍(
2014/02/04 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
javascript设置和获取cookie的方法实例详解
2016/01/05 Javascript
深入浅析JavaScript中的constructor
2016/04/19 Javascript
老生常谈JQuery data方法的使用
2016/09/09 Javascript
JS插件plupload.js实现多图上传并显示进度条
2016/11/29 Javascript
jQuery展示表格点击变色、全选、删除
2017/01/05 Javascript
详解如何在 vue 项目里正确地引用 jquery 和 jquery-ui的插件
2017/06/01 jQuery
vue渲染时闪烁{{}}的问题及解决方法
2018/03/28 Javascript
angularJs select绑定的model取不到值的解决方法
2018/10/08 Javascript
JavaScript获取某一天所在的星期
2019/09/05 Javascript
Vue Components 数字键盘的实现
2019/09/18 Javascript
[54:43]DOTA2-DPC中国联赛 正赛 CDEC vs Dynasty BO3 第一场 2月22日
2021/03/11 DOTA
python逐行读取文件内容的三种方法
2014/01/20 Python
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
Python 快速实现CLI 应用程序的脚手架
2017/12/05 Python
python使用tkinter库实现五子棋游戏
2019/06/18 Python
从python读取sql的实例方法
2020/07/21 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
美国家居装饰购物网站:Amanda Lindroth
2020/03/25 全球购物
什么是java序列化,如何实现java序列化
2012/11/14 面试题
国贸类专业毕业生的求职信分享
2013/12/08 职场文书
军训教官感言
2014/03/02 职场文书
文化与传播毕业生求职信
2014/03/09 职场文书
2014年学校国庆主题活动方案
2014/09/16 职场文书
个人整改方案范文
2014/10/25 职场文书
2014年基建工作总结
2014/12/12 职场文书
小学六年级毕业感言
2015/07/30 职场文书
六一亲子活动感想
2015/08/07 职场文书
《爬天都峰》教学反思
2016/02/23 职场文书
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电