嵌入式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缓存-序列化对象存储乱码问题的解决
Jun 21 Redis
压缩Redis里的字符串大对象操作
Jun 23 Redis
redis cluster支持pipeline的实现思路
Jun 23 Redis
redis使用不当导致应用卡死bug的过程解析
Jul 01 Redis
Redis 彻底禁用RDB持久化操作
Jul 09 Redis
redis中lua脚本使用教程
Nov 01 Redis
linux下安装redis图文详细步骤
Dec 04 Redis
解决 Redis 秒杀超卖场景的高并发
Apr 12 Redis
Redis基本数据类型String常用操作命令
Jun 01 Redis
Redis全局ID生成器的实现
Jun 05 Redis
关于Redis的主从复制及哨兵问题
Jun 16 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实现批量压缩图片文件大小的脚本
2014/07/04 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
2018/05/24 PHP
Dojo之路:如何利用Dojo实现Drag and Drop效果
2007/04/10 Javascript
JavaScript DOM学习第四章 getElementByTagNames
2010/02/19 Javascript
关于Javascript 对象(object)的prototype
2014/05/09 Javascript
javascript通过获取html标签属性class实现多选项卡的方法
2015/07/27 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
XML文件转化成NSData对象的方法
2015/08/12 Javascript
Jquery-1.9.1源码分析系列(十一)之DOM操作
2015/11/25 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
2016/12/02 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
2017/02/12 Javascript
NodeJS基础API搭建服务器详细过程记录
2017/04/01 NodeJs
详解jquery选择器的原理
2017/08/01 jQuery
浅谈mint-ui loadmore组件注意的问题
2017/11/08 Javascript
vue获取验证码倒计时组件
2019/08/26 Javascript
js实现鼠标拖拽div左右滑动
2020/01/15 Javascript
JavaScript实现好看的跟随彩色气泡效果
2020/02/06 Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
2020/04/15 Javascript
Python3简单实例计算同花的概率代码
2017/12/06 Python
Python实现matplotlib显示中文的方法详解
2018/02/06 Python
python 读取文件并替换字段的实例
2018/07/12 Python
python3 实现一行输入,空格隔开的示例
2018/11/14 Python
Pandas数据离散化原理及实例解析
2019/11/16 Python
Python数组并集交集补集代码实例
2020/02/18 Python
Selenium启动Chrome时配置选项详解
2020/03/18 Python
Python使用Turtle模块绘制国旗的方法示例
2021/02/28 Python
巴西婴儿用品商店:Bebe Store
2017/11/23 全球购物
连卡佛中国官网:Lane Crawford中文站
2018/01/27 全球购物
公司道歉信范文
2014/01/09 职场文书
家长会开场白和结束语
2015/05/29 职场文书
老人院义工活动感想
2015/08/07 职场文书
大学生饮品店创业计划书范文
2019/07/10 职场文书
goland 清除所有的默认设置操作
2021/04/28 Golang
详解Redis集群搭建的三种方式
2021/05/31 Redis
5种方法告诉你如何使JavaScript 代码库更干净
2021/09/15 Javascript