嵌入式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 相关文章推荐
为Java项目添加Redis缓存的方法
May 18 Redis
redis使用不当导致应用卡死bug的过程解析
Jul 01 Redis
Redis中一个String类型引发的惨案
Jul 25 Redis
Redis Cluster 集群搭建你会吗
Aug 04 Redis
Redis的字符串是如何实现的
Oct 24 Redis
Springboot/Springcloud项目集成redis进行存取的过程解析
Dec 04 Redis
linux下安装redis图文详细步骤
Dec 04 Redis
redis数据一致性的实现示例
Mar 18 Redis
redis数据结构之压缩列表
Mar 21 Redis
muduo TcpServer模块源码分析
Apr 26 Redis
Redis 异步机制
May 15 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
六酷社区论坛HOME页清新格调免费版 下载
2007/03/07 PHP
php更新mysql后获取影响的行数发生异常解决方法
2013/03/28 PHP
php session 写入数据库
2016/02/13 PHP
PHP表单验证内容是否为空的实现代码
2016/11/14 PHP
PHP从尾到头打印链表实例讲解
2018/09/27 PHP
ie和firefox不兼容的解决方法集合
2009/04/28 Javascript
一组JS创建和操作表格的函数集合
2009/05/07 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
基于datagrid框架的查询
2013/04/08 Javascript
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
jQuery命名空间与闭包用法示例
2017/01/12 Javascript
基于代数方程库Algebra.js解二元一次方程功能示例
2017/06/09 Javascript
详解基于Vue-cli搭建的项目如何和后台交互
2018/06/29 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
vue使用keep-alive保持滚动条位置的实现方法
2019/04/09 Javascript
js判断密码强度的方法
2020/03/18 Javascript
[14:50]2018DOTA2亚洲邀请赛开幕式
2018/04/03 DOTA
[01:00:13]完美世界DOTA2联赛 LBZS vs Forest 第一场 11.07
2020/11/09 DOTA
Python中使用logging模块代替print(logging简明指南)
2014/07/09 Python
Python中列表的一些基本操作知识汇总
2015/05/20 Python
Python中的数据对象持久化存储模块pickle的使用示例
2016/03/03 Python
Python 基础教程之str和repr的详解
2017/08/20 Python
Pycharm创建项目时如何自动添加头部信息
2019/11/14 Python
python的列表List求均值和中位数实例
2020/03/03 Python
Tensorflow卷积实现原理+手写python代码实现卷积教程
2020/05/22 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
电影T恤、80年代T恤和80年代服装:TV Store Online
2020/01/05 全球购物
中专毕业个人的自荐信格式
2013/09/21 职场文书
造型师求职自荐信
2013/09/27 职场文书
打造完美自荐信
2014/01/24 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
代办出身证明书
2014/10/21 职场文书
护士求职简历自我评价
2015/03/10 职场文书
2015年仓库管理工作总结
2015/05/25 职场文书
php微信小程序解包过程实例详解
2021/03/31 PHP
一级电子管军用接收机测评
2022/04/05 无线电