嵌入式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 相关文章推荐
详解RedisTemplate下Redis分布式锁引发的系列问题
Apr 27 Redis
解析Redis Cluster原理
Jun 21 Redis
你真的了解redis为什么要提供pipeline功能
Jun 22 Redis
k8s部署redis cluster集群的实现
Jun 24 Redis
redis的list数据类型相关命令介绍及使用
Jan 18 Redis
redis 解决库存并发问题实现数量控制
Apr 08 Redis
Redis实现一个账号只能登录一个设备
Apr 19 Redis
Redis数据同步之redis shake的实现方法
Apr 21 Redis
Redis 限流器
May 15 Redis
解决 redis 无法远程连接
May 15 Redis
Redis入门基础常用操作命令整理
Jun 01 Redis
redis protocol通信协议及使用详解
Jul 15 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
提问的智慧(2)
2006/10/09 PHP
CodeIgniter实现更改view文件夹路径的方法
2014/07/04 PHP
使用PHP编写发红包程序
2015/07/22 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
laravel5实现微信第三方登录功能
2018/12/06 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
javascript中使用css需要注意的地方小结
2010/09/01 Javascript
浅谈jQuery before和insertBefore的区别
2016/12/04 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
浅谈mint-ui 填坑之路
2017/11/06 Javascript
浅谈Webpack自动化构建实践指南
2017/12/18 Javascript
微信小程序新手教程之页面打开数量限制
2019/03/03 Javascript
简单说说如何使用vue-router插件的方法
2019/04/08 Javascript
使用JS判断页面是首次被加载还是刷新
2019/05/26 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
nodejs脚本centos开机启动实操方法
2020/03/04 NodeJs
基于JS实现视频上传显示进度条
2020/05/12 Javascript
简单了解JavaScript arguement原理及作用
2020/05/28 Javascript
Python的Django框架中forms表单类的使用方法详解
2016/06/21 Python
Django返回json数据用法示例
2016/09/18 Python
python2 与 pyhton3的输入语句写法小结
2018/09/10 Python
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
Python基于pyecharts实现关联图绘制
2020/03/27 Python
python 实现 hive中类似 lateral view explode的功能示例
2020/05/18 Python
可视化pytorch 模型中不同BN层的running mean曲线实例
2020/06/24 Python
CSS3 3D旋转rotate效果实例介绍
2016/05/03 HTML / CSS
Debenhams爱尔兰:英国知名的百货公司
2017/01/02 全球购物
生物技术专业毕业生求职信范文
2013/12/14 职场文书
家庭教育先进个人事迹材料
2014/01/24 职场文书
医院竞聘演讲稿
2014/05/16 职场文书
党的群众路线教育实践活动通讯稿
2014/09/10 职场文书
微笑面对生活演讲稿
2014/09/23 职场文书
大学生军训感言
2015/08/01 职场文书
导游词之泉州崇武古城
2019/12/20 职场文书
Python办公自动化之教你如何用Python将任意文件转为PDF格式
2021/06/28 Python