单元测试之- mock工具mockito
常用的mock工具mockito
在编写单元测试时,需要mock依赖的对象,减少依赖对象对测试的影响,Mocktio是常用的mock工具之一,那么mockito提供了哪些功能呢?
-
Mock对象的创建和配置:Mockito可以通过简单的语法创建mock对象,并允许你配置mock对象的行为。
-
Mock对象的验证:Mockito提供了一系列的验证方法,可以帮助你验证mock对象的方法是否被正确调用,以及调用次数、参数等信息是否符合预期。
-
Stubbing(桩):Mockito允许你为mock对象的方法设置返回值或者抛出异常,这个过程被称为Stubbing(桩)。
-
Spy(间谍):Mockito允许你创建一个实际的对象,但你可以使用Mockito来监控对象的某些行为。
-
参数匹配器:Mockito提供了多种参数匹配器,可以帮助你验证mock对象方法的调用是否符合预期。例如,any()可以匹配任何参数,eq()可以匹配一个指定的值等。
-
Annotation支持:Mockito支持在测试中使用注解来简化mock对象的创建和管理,例如@Mock和@Spy。
下面是一些实际例子,通过这些例子可以了解到如何使用Mockito框架来mock方法行为,并进行不同目的的验证,例如验证方法的返回,方法是否被调用过。

除了对返回结果和是否被调用进行测试外,还可以测试执行的方法是否超时,方法执行顺序等。具体例子如下所示:


上面是一个直接mock List class的例子,接下来看看mock一个自定义的class。下面的例子中,OneClass中依赖TwoClass,如果要对OneClass进行测试,那么需要Mock TwoClass这个class。除了直接用Mockito.mock(ClassName.class)进行mock外,还可以使用注解@Mock,@InjectedMock。如下图右图所示:
使用@InjectMocks注解时,Mockito会自动查找并将标记为@Mock的对象注入到被测类中,从而实现依赖注入。当测试类中需要模拟依赖对象的行为时,我们可以使用@Mock来创建这些虚拟对象,并在测试中定义它们的行为和返回值。所以@Mock和@InjectMocks一般配合使用,这样不用手动将依赖的mock对象设置到被测class的构造函数中,或者属性中。除了@Mock和@InjectMocks注解外,在测试class上面,还有@ExtendWith(MockitoExtension.class)。@ExtendWith(MockitoExtension.class)告诉JUnit 5在运行测试时,使用MockitoExtension来扩展测试执行环境,从而支持Mockito相关的功能,例如使用@Mock、@InjectMocks等注解。如果是Junit4,那么使用@RunWith(MockitoJUnitRunner.class)。
需要注意一点:Mockito是基于动态代理的框架,它可以模拟Java接口和普通的类,但对于一些特殊类型的类,例如静态类、final类和私有构造函数的类,Mockito是无法直接进行模拟。如果是3.4.0或者以上版本的mockito,可以mock静态class。对于某些特定情况,还可以引入powermock来进行mock,或者不mock,直接使用真实对象。
PowerMock 是一个用于 Java 开发的扩展测试框架,可以与 Mockito 集成使用。PowerMock 可以用于 Mockito 无法 Mock 的一些场景,例如:
-
静态方法和私有方法的 Mock
-
Final 类和 Final 方法的 Mock
-
构造函数的Mock
-
静态初始化块的Mock
在使用powermock时,需要注意的是,PowerMock 通过使用 Java Instrumentation API 进行字节码操作来实现上述功能,因此使用 PowerMock 需要引入一些额外的依赖,并且可能会影响测试的性能和稳定性。同时,PowerMock 对代码的修改可能会影响代码的可维护性和可读性,因此需要谨慎使用。在编写单元测试过程中,除了选择合适的工具外,还需要解决好单元测试可测性问题。
单元测试可测性问题
-
代码中存在过多的依赖:当代码中存在大量的依赖关系时,单元测试变得困难,因为要在测试环境中创建和管理所有依赖的对象和资源。此时可以使用依赖注入、抽象工厂等技术来减少依赖关系,从而提高代码的可测试性。
-
代码中存在过多的状态:当代码中存在大量的状态时,单元测试也变得困难,因为需要在测试中管理和维护状态。此时可以使用不可变对象、纯函数等技术来减少状态的影响,从而提高代码的可测试性。
-
代码中存在难以模拟的外部资源:当代码中存在难以模拟的外部资源时,单元测试也变得困难,例如数据库、网络等。此时可以使用测试替身、内存数据库等技术来模拟外部资源,从而提高代码的可测试性。更多mocktio工具使用详情信息可查看官网信息。
前面的例子都是比较单一的例子,下面给出一个完成的demo,来看看如何为里面的class编写单元测试。如下图所示,包含repository,model,service,util四部分,被测代码PersonService中依赖的对象有PersonRequest,Person,SalaryCalculatehe TimeUtil,其中SalaryCalculatehe TimeUtil是静态类。
下面是为PersonalService编写的单元测试,可以看到,因为PersonRequest对象是model是一个请求对象,所以,直接用New的方式创建了PersonRequest。对于静态类,这里使用了mockStatic方法来模拟。单元测试中测试了if逻辑的两种结果。

再来看看依赖数据库的class如何编写单元测试,下面是UserRegistration的代码,代码中调用了userRepository class,Repository会依赖数据哭。

下面是为UserRegistration方法编写的单元测试,也是验证了if逻辑中的两种场景。单元测试中通过@Mock模拟了依赖的UserRepository class。

以上就是单元测试的一些基础知识介绍。
相关文章:
单元测试之- mock工具mockito
常用的mock工具mockito 在编写单元测试时,需要mock依赖的对象,减少依赖对象对测试的影响,Mocktio是常用的mock工具之一,那么mockito提供了哪些功能呢? Mock对象的创建和配置:Mockito可以通过简单的语法创建…...
03 线程间共享数据
unique_lock 因为unique_lock类也具有成员函数lock,unlock,trylock,它含有一个内部标志,表明关联的互斥是否正在被使用,此标志可以通过调用成员函数owns_lock()查询。 1 在初始化过程中保护共享数据 延迟初始化 ( l…...
题目:2264.找到一个数字的 K 美丽度
题目来源: leetcode题目,网址:2269. 找到一个数字的 K 美丽值 - 力扣(LeetCode) 解题思路: 使用滑动窗口遍历判断,窗口中放置 k 个数字,每次后移一位。 解题代码: c…...
分布式ID性能评测:CosId VS 美团 Leaf
环境 MacBook Pro (M1)JDK 17JMH 1.36运行在本机 Docker 内的 mariadb:10.6.4 运行 CosId SegmentChainId 模式,基准测试代码: Benchmarkpublic long generate() {return segmentChainId.generate();}Leaf 基准测试代码: Benchmarkpublic l…...
MySQL数据库安装(二)
夕阳留恋的不是黄昏,而是朝阳 上一章简单介绍了MySQL数据库概述(一), 如果没有看过, 请观看上一章 一. MySQL 卸载 一.一 停止MySQL服务 在卸载之前,先停止MySQL8.0的服务。按键盘上的“Ctrl Alt Delete”组合键,打开“任务管理器”对话…...
通过MySQL删除Hive元数据信息
之前遇到过一个问题,在进行Hive的元数据采集时,因为Hive表的文件已经被删除了,当时是无法删除表,导致元数据采集也发生了问题,所以希望通过删除Hive表的元数据解决上述问题。 之前安装时,经过特定的配置后…...
在电脑如何翻译文件名称并同时保存原文件名和新文件名称
不知道大家在日常工作中有没有遇见到文件名英语或其他评论文字需要翻译成中文呢,翻译成中文后,需要把原来文件名称一起保存下来,呈现上新文件名上。也是通俗的说法,新文件名称也有原文件名称在呢。这个就有点难度吧。一般我们常见…...
Modbus协议简介与常用测试指令说明
DateAuthorVersionNote2022.07.19Dog TaoV1.01. 完成了文档的撰写。2023.08.04Dog TaoV1.21. 修订文档,增加了Modbus协议简介小节。 本文档提供ModbusPoll调试软件与官方部署文档合辑资源(CSDN平台)。 文章目录 Modbus协议简介发展历史主要技…...
EXCEL里数值列如何显示序号?如何重新排序? 怎么取得排序后的序号?
目录 1 EXCEL里如何显示序号? 2 如何重新排序? 3 怎么取得排序后的序号? 3.1 rank() 的序号可能不连续 3.2 方法2:SUMPRODUCT((C7>C$7:C$12)/COUNTIF(C$7:C$12,C$7:C$12))1 EXCEL里如何显示序号?如何重新排序…...
kubernetes 集群利用 efk 收集容器日志
文章目录 [toc]前情提要制作 centos 基础镜像准备 efk 二进制文件部署 efk 组件配置 namespace配置 gfs 的 endpoints配置 pv 和 pvc部署 elasticsearchefk-cmefk-svcefk-sts 部署 filebeatfilebeat-cmfilebeat-ds 部署 kibanakibana-cmkibana-svckibana-dp使用 nodeport 访问 …...
安防视频监控汇聚平台EasyCVR在移动端火狐浏览器中云台显示的优化
安防监控视频EasyCVR视频融合平台基于云边端一体化架构,具有强大的数据接入、视频监控汇聚、处理及分发能力,平台能对前端接入设备进行统一集中管理,支持采用设备树对设备进行分组、分级管理,支持设备状态监测、云端运维等功能&am…...
selenium官文文档阅读总结(day 3)
1.关联型xpath的用法 driver.find_element(By.XPATH,//a[text()"xxx"]/ancestor::祖先元素的标签名//……) 2.selenium等待 等待的作用 :在系统运行的过程中,等待网页内容的加载显示。需要耗费的时间,与网络速度、接口的复杂程度…...
【pandas百炼成钢】数据预览与预处理
知识目录 前言一、数据查看1 - 查看数据维度2 - 随机查看5条数据3 - 查看数据前后5行4 - 查看数据基本信息5 - 查看数据统计信息|数值6 - 查看数据统计信息|非数值7 - 查看数据统计信息|整体 二、缺失值处理8 - 计算缺失值|总计9 …...
怎么查到企业的供应商和客户?
企业的供应商和客户是什么? 其实不需要过多介绍,我们对供应商和客户都有自己的理解,供应商就是负责企业产品的供应,企业从供应商那里买材料进行加工得到的产品,卖给客户。 官方来说供应商是向企业和竞争对手提供各种…...
智能物流千人俱乐部---行业必备神器
千人俱乐部前两天正式推出了。 智能物流千人俱乐部详情 很多行业内的甲方和乙方的朋友过来问,这个千人俱乐部到底怎么玩?今天再来解释一下。 1、为什么搞这个千人俱乐部? 一个原因是:研习社天天都有甲方粉丝让推荐设备厂家&#x…...
uniapp uview文件上传的文件不是文件流,该如何处理?用了uni.chooseImage预览功能要如何做
在使用uniapp开发,运用的ui是用uview,这边需要做一个身份认证,如下图 使用的是uview的u-upload组件,可是这个组件传给后端的不是文件流 后端接口需要的是文件流格式,后面使用了uniapp的选择图片或者拍照的api&#x…...
pktgen-dpdk arm编译问题 “Platform must be built with RTE_FORCE_INTRINSICS“
编译报错 /usr/include/rte_atomic_32.h:9:4: error: #error Platform must be built with RTE_FORCE_INTRINSICS解决办法: 我是在 arm架构服务器上编译出现这个,要定义 RTE_FORCE_INTRINSICS 在meson.build中 增加gcc编译参数 add_project_arguments(…...
用html+javascript打造公文一键排版系统12:删除附件说明中“附件:”里的空格
如果我们在输入附件说明时在“附件:”之间加入空格,那么排版时就要删除这些空格。 因为string对象replace()支持正则表达式,于是考虑用replace()来完成。 写了一段只有一个多余空格的代码来测试: <!DOCTYPE HTML> <HT…...
容器技术:Docker搭建(通俗易懂)
目录 Docker搭建环境准备Docker安装1、查看服务器是否安装Docker2、卸载Docker3、安装Dokcer依赖环境4、配置Docker国内阿里云镜像5、安装Docker6、查看Docker信息7、配置阿里云镜像加速8、镜像安装10、运行实例11、查看实例状态12、测试 Docker命令集合 Docker搭建 环境准备 …...
Day 16 C++ 友元(friend)
目录 什么是友元(friend) 友元的三种实现 全局函数做友元 类做友元 成员函数做友元 什么是友元(friend) 友元是一种访问控制的机制,它允许一个类或函数访问另一个类的私有成员。通过友元关系,可以在需要…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
