嵌入式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 相关文章推荐
在K8s上部署Redis集群的方法步骤
Apr 27 Redis
Redis5之后版本的高可用集群搭建的实现
Apr 27 Redis
使用Redis实现秒杀功能的简单方法
May 08 Redis
详解redis分布式锁的这些坑
May 19 Redis
深入理解redis中multi与pipeline
Jun 02 Redis
redis使用不当导致应用卡死bug的过程解析
Jul 01 Redis
Redis 常见使用场景
Aug 30 Redis
Redis 持久化 RDB 与 AOF的执行过程
Nov 07 Redis
 Redis 串行生成顺序编码的方法实现
Apr 03 Redis
Redis 报错 error:NOAUTH Authentication required
May 15 Redis
浅谈Redis变慢的原因及排查方法
Jun 21 Redis
利用Redis实现点赞功能的示例代码
Jun 28 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
ajax实现无刷新分页(php)
2010/07/18 PHP
php去除重复字的实现代码
2011/09/16 PHP
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
yii中widget的用法
2014/12/03 PHP
Zend Framework上传文件重命名的实现方法
2016/11/25 PHP
php array_map()函数实例用法
2021/03/03 PHP
基于jquery封装的一个js分页
2011/11/15 Javascript
常见的原始JS选择器使用方法总结
2014/04/09 Javascript
JavaScript中常用的六种互动方法示例
2015/03/13 Javascript
js动态创建及移除div的方法
2015/06/03 Javascript
第九篇Bootstrap导航菜单创建步骤详解
2016/06/21 Javascript
JavaScript之Vue.js【入门基础】
2016/12/06 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
2018/05/15 Javascript
详解从Vue-router到html5的pushState
2018/07/21 Javascript
js中自定义react数据验证组件实例详解
2018/10/19 Javascript
Django+vue跨域问题解决的详细步骤
2019/01/20 Javascript
Vue 中如何正确引入第三方模块的方法步骤
2019/05/05 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
如何在微信小程序中实现Mixins方案
2019/06/20 Javascript
解决vue项目,npm run build后,报路径错的问题
2020/08/13 Javascript
如何利用 JS 脚本实现网页全自动秒杀抢购功能
2020/10/12 Javascript
Vant picker 多级联动操作
2020/11/02 Javascript
详解datagrid使用方法(重要)
2020/11/06 Javascript
利用一个简单的例子窥探CPython内核的运行机制
2015/03/30 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
Python列表倒序输出及其效率详解
2020/03/04 Python
基于HTML5 Canvas 实现弹出框效果
2017/06/05 HTML / CSS
美国网上订购鲜花:FTD
2016/09/23 全球购物
时尚孕妇装:Ingrid & Isabel
2019/05/08 全球购物
英语自我评价范文
2014/01/24 职场文书
2014年人民调解工作总结
2014/12/08 职场文书
党员心得体会范文2016
2016/01/23 职场文书
python基础之模块的导入
2021/10/24 Python
使用javascript解析二维码的三种方式
2021/11/11 Javascript