当前位置: 首页 > news >正文

单元测试之- mock工具mockito

 常用的mock工具mockito

在编写单元测试时,需要mock依赖的对象,减少依赖对象对测试的影响,Mocktio是常用的mock工具之一,那么mockito提供了哪些功能呢?

  1. Mock对象的创建和配置:Mockito可以通过简单的语法创建mock对象,并允许你配置mock对象的行为。

  2. Mock对象的验证:Mockito提供了一系列的验证方法,可以帮助你验证mock对象的方法是否被正确调用,以及调用次数、参数等信息是否符合预期。

  3. Stubbing(桩):Mockito允许你为mock对象的方法设置返回值或者抛出异常,这个过程被称为Stubbing(桩)。

  4. Spy(间谍):Mockito允许你创建一个实际的对象,但你可以使用Mockito来监控对象的某些行为。

  5. 参数匹配器:Mockito提供了多种参数匹配器,可以帮助你验证mock对象方法的调用是否符合预期。例如,any()可以匹配任何参数,eq()可以匹配一个指定的值等。

  6. 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 的一些场景,例如:

  1. 静态方法和私有方法的 Mock

  2. Final 类和 Final 方法的 Mock

  3. 构造函数的Mock

  4. 静态初始化块的Mock

在使用powermock时,需要注意的是,PowerMock 通过使用 Java Instrumentation API 进行字节码操作来实现上述功能,因此使用 PowerMock 需要引入一些额外的依赖,并且可能会影响测试的性能和稳定性。同时,PowerMock 对代码的修改可能会影响代码的可维护性和可读性,因此需要谨慎使用。在编写单元测试过程中,除了选择合适的工具外,还需要解决好单元测试可测性问题。

单元测试可测性问题

  1. 代码中存在过多的依赖:当代码中存在大量的依赖关系时,单元测试变得困难,因为要在测试环境中创建和管理所有依赖的对象和资源。此时可以使用依赖注入、抽象工厂等技术来减少依赖关系,从而提高代码的可测试性。

  2. 代码中存在过多的状态:当代码中存在大量的状态时,单元测试也变得困难,因为需要在测试中管理和维护状态。此时可以使用不可变对象、纯函数等技术来减少状态的影响,从而提高代码的可测试性。

  3. 代码中存在难以模拟的外部资源:当代码中存在难以模拟的外部资源时,单元测试也变得困难,例如数据库、网络等。此时可以使用测试替身、内存数据库等技术来模拟外部资源,从而提高代码的可测试性。更多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:删除附件说明中“附件:”里的空格

如果我们在输入附件说明时在“附件&#xff1a;”之间加入空格&#xff0c;那么排版时就要删除这些空格。 因为string对象replace()支持正则表达式&#xff0c;于是考虑用replace()来完成。 写了一段只有一个多余空格的代码来测试&#xff1a; <!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)

目录 什么是友元&#xff08;friend&#xff09; 友元的三种实现 全局函数做友元 类做友元 成员函数做友元 什么是友元&#xff08;friend&#xff09; 友元是一种访问控制的机制&#xff0c;它允许一个类或函数访问另一个类的私有成员。通过友元关系&#xff0c;可以在需要…...

精简GVCP与GVSP:FPGA实现GigE Vision相机高效采集的工程实践

1. 为什么需要精简GigE Vision协议&#xff1f; 第一次接触GigE Vision相机时&#xff0c;我被它复杂的协议栈吓了一跳。完整的GigE Vision协议包含几十种功能模块&#xff0c;光是协议文档就有上千页。但在实际工业视觉项目中&#xff0c;我们往往只需要最基础的三个功能&…...

Python的__init__方法调用父类初始化与多重继承中的参数传递问题

Python作为一门灵活且强大的编程语言&#xff0c;其面向对象特性中的继承机制尤为关键。其中&#xff0c;__init__方法的初始化调用以及多重继承中的参数传递问题&#xff0c;常常让开发者感到困惑。理解这些细节不仅能避免潜在的错误&#xff0c;还能提升代码的可维护性。本文…...

FireRed-OCR Studio惊艳效果展示:复杂表格+公式精准还原实录

FireRed-OCR Studio惊艳效果展示&#xff1a;复杂表格公式精准还原实录 1. 工业级文档解析新标杆 在数字化办公时代&#xff0c;我们每天都要处理大量纸质文档和PDF文件。传统OCR工具往往只能识别文字内容&#xff0c;遇到复杂表格、数学公式或特殊排版时就会束手无策。FireR…...

Fish Speech 1.5开发者案例:集成至微信小程序实现语音播报功能

Fish Speech 1.5开发者案例&#xff1a;集成至微信小程序实现语音播报功能 1. 项目背景与需求 在实际的微信小程序开发中&#xff0c;语音播报功能已经成为提升用户体验的重要特性。无论是新闻阅读、教育学习、还是电商导购场景&#xff0c;高质量的语音合成都能让应用更加生…...

内网穿透技术解析:安全远程访问部署于内网的CYBER-VISION零号协议服务

内网穿透技术解析&#xff1a;安全远程访问部署于内网的AI模型服务 想象一下这个场景&#xff1a;你的团队费了九牛二虎之力&#xff0c;终于在一台内网服务器上部署好了一套强大的AI模型服务&#xff0c;比如一个能自动生成设计图的图像生成模型&#xff0c;或者一个能理解复…...

Qwen3-Embedding-4B效果实测:32K长文本理解,中文检索表现惊艳

Qwen3-Embedding-4B效果实测&#xff1a;32K长文本理解&#xff0c;中文检索表现惊艳 1. 引言&#xff1a;为什么关注文本嵌入模型 在信息爆炸的时代&#xff0c;如何让计算机真正"理解"人类语言成为关键挑战。文本嵌入模型&#xff08;Text Embedding Model&#…...

TexLive极简安装法:5分钟搞定基础版+中英文支持(附磁盘空间不足解决方案)

TexLive极简安装法&#xff1a;5分钟搞定基础版中英文支持&#xff08;附磁盘空间不足解决方案&#xff09; 在学术写作和科研文档排版领域&#xff0c;LaTeX以其专业的排版质量和稳定性成为不可替代的工具。然而&#xff0c;传统的TexLive完整安装往往需要占用6GB以上的磁盘空…...

告别手写脚本!用Frida-Trace自动Hook Android App的Java方法(附实战Demo)

告别手写脚本&#xff01;用Frida-Trace自动Hook Android App的Java方法&#xff08;附实战Demo&#xff09; 逆向分析Android应用时&#xff0c;手动编写Hook脚本往往耗时费力——尤其是面对未知应用&#xff0c;开发者需要反复尝试类名、方法签名&#xff0c;甚至逐行调试参数…...

从几何视角理解Givens旋转:为什么它能完美解决QR分解?

几何动画拆解Givens旋转&#xff1a;QR分解的视觉化通关指南 想象你手里握着一根倾斜的多节天线&#xff0c;如何通过最简单的旋转操作让它完全竖直&#xff1f;这个看似简单的物理问题&#xff0c;恰恰揭示了Givens旋转在矩阵分解中的核心思想——通过一系列精心设计的平面旋…...

芯洲SCT SCT2630ASTER ESOP-8 DC-DC电源芯片

特性宽输入范围&#xff1a;4.5V - 60V高达3.5A的连续输出电流0.8V 1%反馈参考电压集成80mΩ高端MOSFET低静态电流&#xff1a;175uA轻载时采用脉冲跳跃模式&#xff08;PSM&#xff09;最小导通时间130ns4ms内部软启动时间可调频率100kHz至1.2MHz外部时钟同步精确使能阈值&…...