搭建大型分布式服务(四十六)利用mockito不启动SpringBoot项目下进行单元测试

news2024/9/25 21:21:55

系列文章目录


文章目录

  • 系列文章目录
  • 前言
      • 一、本文要点
      • 二、开发环境
      • 三、编写真实类
      • 四、编写测试类
      • 四、小结


前言

SpringBoot支持集成Mockito做单元测试,有时候SpringBoot有很多外部依赖,在本地很难启动或者启动时间很长,而我们只想对某个方法进行测试,需要怎样做呢?


一、本文要点

接前文,我们已经已介绍在两种mock模式下,怎样根据入参返回自定义mock结果,但都是通过启动SpringBoot项目来运行的。本文将介绍不启动SpringBoot的情况下运行单元测试。
系列文章完整目录

  • SpringBooot 单元测试
  • Mockito 单元测试
  • Mock、Spy 单元测试
  • InjectMocks 注入深层依赖

二、开发环境

  • jdk 1.8
  • maven 3.6.2
  • springboot 2.4.3
  • idea 2020
  • junit5
  • Mockito

三、编写真实类

1、编写真实Service类TagService.java,它依赖ElasticeService类,模拟真实应用场景。

@Slf4j
@Getter
@Service("tagService")
public class TagService {

    // 操作远程ES工具类
	private ElasticeService elasticService;
	
	// 依赖ES工具类实现逻辑
    public String listTags(String bId) {
        return elasticService.list(bId);
    }
}

2、编写真实service类ElasticService.java,它依赖restHighLevelClientProxy类,模拟操作es工具类。

@Slf4j
@Getter
@Service("elasticService")
public class ElasticeService {

	@Resource
	private RestHighLevelClientProxy proxy;
	
	// 依赖ES工具类实现逻辑
    public String listTags(String bId) {
        // 远程调用
        SearchResponse searchResponse = restHighLevelClientProxy.search(bId);
        // 其他逻辑
        return "";
    }
}

四、编写测试类

1、@InjectMocks 用来注入依赖类,这里不再使用SpringExtension启动单元测试类,而是使用MockitoJUnitRunner类。

@Slf4j
@ActiveProfiles("dev")
@RunWith(MockitoJUnitRunner.class)
class TagServiceTest {

    /**
     * 这里使用MockBean,tagService中所有方法都会被mock掉.
     */
    @InjectMocks
    private TagService tagService;
    
    // 依赖的操作远程ES工具类,直接mock掉
    // @Mock跟上一篇文章介绍的@MockBean类似
    @Mock
	private ElasticeService elasticService;
	
    @Test
    void buildTagName() {

      Mockito.when(elasticService.listTags(Mockito.any())
                .thenReturn(mockResult());
                
        String bid = "45345xclm34kxjL";

        log.info(tagService.listTags(bid));

    }
}

2、如果我们只想mock掉RestHighLevelClientProxy类,还想测试ElasticeService类的逻辑,这时候需要处理深度依赖,也就是需要把proxy也注入。

@Slf4j
@ActiveProfiles("dev")
@RunWith(MockitoJUnitRunner.class)
class TagServiceTest {

    /**
     * 这里使用MockBean,tagService中所有方法都会被mock掉.
     */
    @InjectMocks
    private TagService tagService;
    
    // 注入内层依赖,@Spy跟上一篇文章介绍的@SpyBean类似
    @Spy
    @InjectMocks
	private ElasticeService elasticService;
	
	// mock掉
	@Mock
    private RestHighLevelClientProxy proxy;
    
    @Test
    void buildTagName() {

      Mockito.when(proxy.listTags(Mockito.any())
                .thenReturn(mockResult());
                
        String bid = "45345xclm34kxjL";

        log.info(tagService.listTags(bid));

    }
}

四、小结

至此,我们就实现了不启动SpringBoot项目就可以运行单元测试啦,下一篇《搭建大型分布式服务(四十七)Junit5如何在所有测试用例前执行初始化方法?》

加我加群一起交流学习!更多干货下载、项目源码和大厂内推等着你

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/487782.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Lattics ——一款简单易用、好看强大的知识管理工具

如何选择一款适合自己的知识管理工具? 对于很多用户而言,在追求效率的路上,经常需要一款适合自己的知识管理工具。然而,随着工具市场的发展,各种新兴工具层出不穷。在传统领域,有印象笔记、Onenote 为代表…

ChatGPT实现知识图谱生成

知识图谱生成 在之前章节中,我们尝试过让 ChatGPT 对一段文本做实体识别和词性分析,结果很不错。但如果是需要长期留存下来,后续在不同场景下快速查询分析,最好还是要把数据存入到专门的图数据库中,才能方便随时读取。…

SpringCloud学习(八)——Docker

文章目录 1. 认识Docker1.1 容器1.2 Linux容器1.3 Docker 2. 配置Docker2.1 安装Docker2.2 启动Docker2.3 配置镜像加速 3. Docker镜像操作3.1 拉取镜像3.2 镜像的打包和加载3.3 查看帮助文档 4. 容器命令4.1 运行容器4.2 进入容器4.3 数据卷 5. 自定义镜像5.1 Dockerfile语法5…

svo论文解读

SVO: Semi-Direct Visual Odometry for Monocular and Multi-Camera Systems 2016TRO MOTION ESTIMATION 1 Sparse Image Alignment 从上一帧的特征投影到当前帧,最小化重投影误差计算帧间位姿(patch44) 2 Relaxation Through Feature Alig…

Vue案例

1. 查询所有 1.1 采用dom方式&#xff0c;拼字符串操作写ajax请求 这种方法书写麻烦&#xff0c;采用Vue的方式书写 <script>//1. 当页面加载完成后&#xff0c;发送ajax请求window.onload function () {//2. 发送ajax请求axios({method:"get",url:"http…

利用ECharts实现winform中的可视化图表

利用ECharts实现winform中的可视化图表 背景思路第一步&#xff08;先搞一个能展示图表的html文件&#xff09;第二步&#xff08;封装到winform中&#xff09;第三步 写代码第四步 winfrom与html交互在html中增加方法 如下在winfrom中增加调用方法数据文件代码 完整的运行效果…

Python教程——Python本地环境安装

文章目录 简介安装Python下载安装验证安装结果 手动添加环境变量安装问题 简介 python官网&#xff1a;https://www.python.org/ Python Windows下载地址&#xff1a;https://www.python.org/downloads/windows/ Python 官方文档&#xff1a;https://www.python.org/doc/ Pytho…

man,cp,mv,alias,more,less,head,tail指令与文件片段读取和管道的初步介绍

tips 文件夹就是目录定位某个文件的位置&#xff0c;本质上就是在Linux的多叉树目录结构下去定位它的位置文件名主干&#xff08;不考虑前缀路径&#xff09;以. 开头的文件就被称为隐藏文件任何一个目录下面都有一个.隐藏文件与…隐藏文件无论window还是Linux&#xff0c;常识…

C语言文件操作【基础知识 + 顺序读写 + 文件版通讯录】

全文目录 &#x1f600; 前言&#x1f914; 什么是文件&#x1f636; 程序文件&#x1f636; 数据文件&#x1f636; 文件名 &#x1f928; 文件指针&#x1f92b; 文件的打开和关闭&#x1f611; fopen 打开文件&#x1f4d9; **mod的规律&#xff1a;** &#x1f611; fclose…

registry私有仓库搭建

目录 一、搭建本地仓库 1、首先下载registry镜像 2、在daemon.json文件中添加私有镜像仓库地址 3、运行registry容器 4、为镜像打标签 5、上传到私有仓库 6、列出私有仓库的所有镜像 7、列出私有仓库的centos 镜像有哪些tag 8、先删除原有的centos的镜像&#xff0c;再…

(九)Geoprocessing地理处理框架——ArcToolbox内容简介

&#xff08;九&#xff09;Geoprocessing地理处理框架——ArcToolbox内容简介 目录 &#xff08;九&#xff09;Geoprocessing地理处理框架——ArcToolbox内容简介 1.工具集简介1.1 3D Analyst工具箱&#xff1a;1.2分析工具箱:1.3制图工具箱:1.4转换工具箱:1.5Data Interoper…

有必要给孩子买台灯吗?分享四款高品质的护眼台灯

有必要使用护眼台灯&#xff0c;尤其是有近视现象的孩子们。 现在很多孩子小学就开始近视了&#xff0c;保护视力刻不容缓呀! 很多人不知道&#xff0c;其实劣质光线是最大的眼睛杀手 给孩子随便买便宜的台灯&#xff0c;看着一样能用&#xff0c;其实时间久了 对孩子眼睛的…

java版企业电子招投标系统源代码之了解电子招标投标全流程

随着各级政府部门的大力推进&#xff0c;以及国内互联网的建设&#xff0c;电子招投标已经逐渐成为国内主流的招标投标方式&#xff0c;但是依然有很多人对电子招投标的流程不够了解&#xff0c;在具体操作上存在困难。虽然各个交易平台的招标投标在线操作会略有不同&#xff0…

每天一道算法练习题--Day20 第一章 --算法专题 --- ----------滑动窗口(思路 + 模板)

笔者最早接触滑动窗口是滑动窗口协议&#xff0c;滑动窗口协议&#xff08;Sliding Window Protocol&#xff09;&#xff0c;属于 TCP 协议的一种应用&#xff0c;用于网络数据传输时的流量控制&#xff0c;以避免拥塞的发生。 发送方和接收方分别有一个窗口大小 w1 和 w2。窗…

机器学习小结之KNN算法

文章目录 前言一、概念1.1 机器学习基本概念1.2 k 值1.3 距离度量1.4 加权方式 二、实现2.1 手写实现2.2 调库 Scikit-learn2.3 测试自己的数据 三、总结3.1 分析3.2 KNN 优缺点 参考 前言 ​ KNN (K-Nearest Neighbor)算法是一种最简单&#xff0c;也是一个很实用的机器学习的…

VLAD Diffusion,一个更好用且易于安装的Stable Diffusion Web UI

VLAD Diffusion 是我们前面介绍过的 AUTOMATIC1111/stable-diffusion-webui的一个定制的更新&#xff0c;它主要是为了更频繁发布的更新和错误修复。它包含 新的安装程序&#xff0c;并且提供了高级CUDA调优不在依赖Accelerate&#xff0c;因为Accelerate是分布式的&#xff0…

setTimeout不准时,CSS精准实现计时器功能

实际开发过程中&#xff0c;我们会经常遇到&#xff0c;首次进入页面进行相应提示&#xff0c;然后指定时间后自动消失或者前端时钟展示等需求。 按照传统方案&#xff0c;我们可以使用 setTimeout 实现。但其存在&#xff1a;实际延时比设定值更久的情况。 setTimeout 不准时…

单个案例奖金2000元!AidLux AI 应用案例悬赏征集活动第二期选题上线啦

AidLux AI 应用案例悬赏征集活动第一期开发者作品新鲜"出炉"啦&#xff01; 得益于AidLux在AI应用部署端的极大优势&#xff0c;开发者们在短时间内轻松落地了大批AI应用。 其中&#xff0c;不乏后厨老鼠识别告警系统、粮食作物特定病虫害告警系统、基于视觉的仰卧起…

专注主业、管控风险,中国春来的“非激进式扩张”

近日&#xff0c;中国春来发布截至2023年2月28日止六个月的中期业绩公告&#xff0c;期内收入同比增长14.2%至7.49亿元&#xff0c;利润同比上涨32%至3.31亿元&#xff0c;交出了亮眼的成绩单。 探究中国春来业绩上涨的原因&#xff0c;关键在于扩大招生。而招生规模很大程度上…

ChatGPT终于被我问到胡说八道的程度了!

问&#xff1a;Python是强类型语言&#xff0c;还是弱类型语言 chatgpt&#xff1a;Python是强类型语言。Python很少会隐式地转换变量的类型&#xff0c;所以Python是强类型的语言 问&#xff1a;什么是强类型语言 chatgpt&#xff1a;强类型语言是指在编程语言中&#xff0…