Mokito的一些API
Mockito是一个Java单元测试框架,它允许开发者创建和配置模拟对象(mock objects),以便在隔离的环境中测试代码,尤其是当实际对象难以构造或其行为不确定时。下面是一些核心的Mockito API及其使用场景和代码示例。
基础API
-
创建Mock对象
@Mock注解或Mockito.mock(Class<T> classToMock)方法用于创建mock对象。
场景: 当你需要模拟一个类的行为,以便测试依赖于它的类或方法时。
示例:
@Mock List<String> mockedList;// 或者 List<String> mockedList = Mockito.mock(List.class); -
定义Mock行为
Mockito.when(mockedMethodCall).thenReturn(value)定义当特定方法被调用时应返回的值。
场景: 你想要控制模拟对象在特定调用下的响应。
示例:
Mockito.when(mockedList.get(0)).thenReturn("first"); -
验证交互
Mockito.verify(mockedObject).methodCall(arguments)验证某个方法是否按照预期被调用了。
场景: 验证测试过程中mock对象的某个方法确实被正确调用。
示例:
mockedList.add("one"); Mockito.verify(mockedList).add("one"); -
捕获参数
- 使用
ArgumentCaptor捕获传递给mock方法的参数,以便进一步检查。
场景: 需要检查方法调用的具体参数时。
示例:
ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class); Mockito.verify(mockedList).add(argument.capture()); assertEquals("captured", argument.getValue()); - 使用
-
设置异常
Mockito.when(mockedMethodCall).thenThrow(exception)用于模拟方法抛出异常。
场景: 测试代码对异常的处理逻辑。
示例:
Mockito.when(mockedList.get(999)).thenThrow(new IndexOutOfBoundsException());
具体使用场景示例
假设你有一个UserService类,它依赖于UserRepository来获取用户信息。你想测试UserService的getUserById方法,但不希望真实地查询数据库。
public class UserService {private UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public User getUserById(int id) {return userRepository.findById(id);}
}public interface UserRepository {User findById(int id);
}
测试类使用Mockito模拟UserRepository:
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;class UserServiceTest {@MockUserRepository userRepository;private UserService userService;@BeforeEachvoid setUp() {userService = new UserService(userRepository);}@Testvoid getUserById_ReturnsUser() {// 创建模拟行为User mockUser = new User(1, "John Doe");when(userRepository.findById(1)).thenReturn(mockUser);// 调用待测试方法User result = userService.getUserById(1);// 验证结果assertEquals(mockUser, result);// 验证交互Mockito.verify(userRepository).findById(1);}
}
在这个例子中,UserRepository被模拟,其findById方法被设定为返回一个预设的User对象,从而允许我们专注于测试UserService的逻辑,而不必关心数据库操作的细节。
当然,除了基本的Mock对象之外,Mockito还提供了Spy功能,以及其他一些高级特性,以满足更复杂的测试需求。下面我将继续介绍这些内容。
Spy
Spy与Mock相似,但它会委托真实对象执行未被模拟的方法调用,只有被明确指定的方法才会被模拟。这在你需要大部分保留原有对象行为,仅修改或监控部分行为时非常有用。
API:
Mockito.spy(Object object)创建一个Spy对象。
场景: 当你希望大部分情况下使用真实对象的行为,只在某些特定方法上进行模拟或验证时。
示例:
public class Calculator {public int add(int a, int b) {return a + b;}public int subtract(int a, int b) {return a - b;}
}@Test
void testSpy() {Calculator realCalculator = new Calculator();Calculator spyCalculator = Mockito.spy(realCalculator);// 模拟add方法的行为when(spyCalculator.add(1, 1)).thenReturn(3);// 调用真实subtract方法int result = spyCalculator.subtract(5, 2);// 验证add方法的模拟行为assertEquals(3, spyCalculator.add(1, 1));// 验证subtract方法的调用及结果assertEquals(3, result);verify(spyCalculator).subtract(5, 2);
}
其他高级API
-
DoAnswer: 提供更灵活的方式来定义模拟方法的行为,可以基于回调函数执行自定义逻辑。
示例:
doAnswer(invocation -> {Object[] args = invocation.getArguments();return args[0] + args[1]; }).when(someMock).someMethod(anyInt(), anyInt()); -
BDD风格: Mockito提供了一套行为驱动开发(Behavior-Driven Development)风格的API,使得测试代码更加可读。
示例:
given(mockedList.get(0)).willReturn("first"); then(mockedList).should().add("one"); -
MockitoJUnitRunner: 使用这个Runner可以自动初始化使用
@Mock或@Spy注解的字段,无需在每个测试方法中手动初始化。示例:
@RunWith(MockitoJUnitRunner.class) public class MyTestClass {@MockList<String> mockedList;// 测试方法... } -
MockitoAnnotations.openMocks(this): 如果不使用
MockitoJUnitRunner,可以在测试类的setUp方法中手动打开Mockito注解。示例:
@BeforeEach public void setUp() {MockitoAnnotations.openMocks(this); }
通过结合使用这些API,Mockito能够帮助开发者编写更加高效、精确的单元测试,确保代码质量。
使用说明
具体使用说明和示例,你可以参考以下资源:
- 官方文档: 访问Mockito官方网站,查看最新的官方文档,包括API参考和用户指南。
- 在线教程: 网站如Stack Overflow上有大量关于Mockito使用的问答,涵盖了从基础到高级的各个方面。
- 技术博客: CSDN、博客园等技术社区有大量Mockito的教程和实践分享,比如通过搜索“Mockito进阶使用”、“Mockito详尽教程”等关键词。
相关文章:
Mokito的一些API
Mockito是一个Java单元测试框架,它允许开发者创建和配置模拟对象(mock objects),以便在隔离的环境中测试代码,尤其是当实际对象难以构造或其行为不确定时。下面是一些核心的Mockito API及其使用场景和代码示例。 基础…...
前端已死? Bootstrap--CSS组件
目录 Bootstrap 下载 Bootstrap--全局CSS样式 栅格系统 栅格参数 正常显示 实例 代码演示: 排版 代码演示 表格 代码演示 表单 代码演示 等等...(文档很清晰了) Bootstrap--组件 结合演示:(页面) Bootstrap Bootstrap v3 中文文档 Bootstrap 是最受欢迎的 HT…...
codewars check_same_case 题解
题目 编写一个函数来检查两个给定的字符是否大小写相同。 如果任何字符不是字母,则返回-1如果两个字符大小写相同,则返回1如果两个字符都是字母且大小写不同,则返回0 例子 a并g返回1A并C返回1b并G返回0B并g返回00并?返回-1题解 1 此题主…...
【Text2SQL 经典模型】X-SQL
论文:X-SQL: reinforce schema representation with context ⭐⭐⭐⭐ Microsoft, arXiv:1908.08113 X-SQL 与 SQLova 类似,使用 BERT style 的 PLM 来获得 representation,只是融合 NL question 和 table schema 的信息的方式不太一样&#…...
蓉耀·时尚双子星------Yestar艺星首家星美学概念院璀璨启航
在医美行业的璀璨星空中,一颗新星于蓉城冉冉升起,点亮了求美者的道路。5月21日,蓉耀•时尚双⼦星--Yestar艺星首家星美学概念院在成都复城国际璀璨启幕,标志着Yestar艺星全球战略布局在蓉城迈出了重要一步,也意味着其在…...
Undet for SketchUp 2023.3 点云建模软件 支持支持草图大师sketchup2021-2022-2023
1.Undet for sketchup 2023.3支持草图大师sketchup2021-2022-2023。支持机载雷达扫描、车载扫描还是地面扫描,对AEC行业用户来说,真正需要的是如何将这些数据快速处理为三维模型,这样才能将这些信息延展到BIM领域发挥效用。因此面对这些海量的…...
CHI dataless 传输——CHI(4)
上篇介绍了read的操作类型,本篇我们来介绍一下dataless 目录 一、dataless操作概览 二、Non-CMO (Non-Cache Maintenance Operation) 1、CleanUnique 2、StashOnce and StashOnceSep 3、Evict 三、CMO (Cache Maintenance Operation) 一、dataless操作概览 名…...
vue3第三十节(vue3 vite中使用sass)
引言:什么是Sass? Sass(Syntactically Awesome Style Sheets)是一种CSS预处理器,它扩展了CSS的功能,提供了更高级的语法和特性,例如变量、嵌套、混合、继承和颜色功能等,这些特性可以帮助开发…...
blender 烘焙渲染图片,已经导出fbx,导出贴图。插件生成图片
1.新建一个模型。选择资产浏览器的材质,并拖动到模型身上,如下图。资产浏览器的材质可以网上找。 2.打开着色器面板。正下方着色器窗口中,点击空白取消选择,然后右击-添加-着色器-原理化BSDF,右击-添加-纹理-图像纹理。…...
ASO行业面临洗牌,苹果应用商店加搜索广告!
苹果公司全球市场营销高级副总裁菲尔席勒(Phil Schiller),在全球开发者大会开幕前(WWDC)透露了一些应用商店方面的消息。重点包括:1.应用商店搜索中加入广告;2.应用审核加快;3.新的商业模式。 一、 Search Ads搜索广告 这是最令人惊讶的改变,苹果在App Store平台的搜索结果中加…...
Labelme自定义数据集COCO格式【实例分割】
参考博客 labelme标注自定义数据集COCO类型_labelme标注coco-CSDN博客 LabelMe使用_labelme中所有的create的作用解释-CSDN博客 1制作自己的数据集 1.1labelme安装 自己的数据和上面数据的区别就在于没有.json标签文件,所以训练自己的数据关键步骤就是获取标签文…...
【网络安全】Linux 应急响应-溯源-系统日志排查知识点
Linux 应急响应-溯源-系统日志排查知识点汇总 1. 查看当前已经登录到系统的用户 (w 命令) w2. 查看所有用户最近一次登录 (lastlog 命令) lastlog lastlog | grep -v "Never logged in"3. 查看历史登录用户以及登录失败的用户 (last 和 lastb 命令) last lastb4. …...
Spark项目实训(一)
目录 实验任务一:计算级数 idea步骤分步: 完整代码: linux步骤分布: 实验任务二:统计学生成绩 idea步骤分布: 完整代码: linux步骤分步: 实验任务一:计算级数 请…...
爬虫基础1
一、爬虫的基本概念 1.什么是爬虫? 请求网站并提取数据的自动化程序 2.爬虫的分类 2.1 通用爬虫(大而全) 功能强大,采集面广,通常用于搜索引擎:百度,360,谷歌 2.2 聚焦爬虫&#x…...
vlan综合实验
1、实验拓扑 2、实验要求 1、pc1和pc3所在接口为access;属于vlan 2; pc2/pc4/pc5/pc6处于同一网段;其中pc2可以访问pc4/pc5/pc6; pc4可以访问pc6;pc5不能访问pc6; 2、pc1/pc3与pc2/pc4/pc5/pc6不在同一网段; 3、所有pc通过DHC…...
如何使用ffmpeg 实现10种特效
相关特效的名字 特效id 特效名 1 向上移动 2 向左移动 3 向下移动 4 颤抖 5 摇摆 6 雨刷 7 弹入 8 弹簧 9 轻微跳动 10 跳动 特效展示(同时汇总相关命令) pad背景显示 pad背景透明 相关命令(一会再讲这些命令,先往下看) # 合成特效语音 ffmpeg -y -loglevel erro…...
C语言如果变量全部在全局内存空间会怎么样
结论先行 应该根据内存使用的生命周期,选择合适的内存空间应该尽量使用连续内存如果不想在设计封装性上付出太多代价,全部放入全局空间也比较可取 空间类型特点全局空间生命周期最久,空间连续,变量分配紧致,但存在浪…...
【YOLO改进】换遍MMPretrain主干网络之ConvNeXt-Tiny(基于MMYOLO)
ConvNeXt-Tiny ConvNeXt-Tiny 是一种改进的卷积神经网络架构,其设计目的是在保持传统卷积神经网络优势的同时,借鉴了一些Transformer架构的成功经验。 ConvNeXt-Tiny 的优点 架构优化: ConvNeXt-Tiny 对经典ResNet架构进行了多种优化&#…...
【数据库】MySQL
文章目录 概述DDL数据库操作查询使用创建删除 表操作创建约束MySqL数据类型数值类型字符串类型日期类型 查询修改删除 DMLinsertupdatedelete DQL基本查询条件查询分组查询分组查询排序查询分页查询 多表设计一对多一对一多对多设计步骤 多表查询概述内连接外连接 子查询标量子…...
JVM运行时内存:垃圾回收器(Serial ParNew Parallel )详解
文章目录 1. 查看默认GC2. Serial GC : 串行回收3. ParNew GC:并行回收4. Parallel GC:吞吐量优先 1. 查看默认GC -XX:PrintCommandLineFlags:查看命令行相关参数(包含使用的垃圾收集器)使用命令行指令:ji…...
VHS Pro深度解析:Unity中模拟录像带失真的物理建模与工业应用
1. 为什么今天还有人执着于“坏掉的画质”?——VHS Pro 不是怀旧装饰,而是视觉叙事新工具你有没有在剪辑软件里拖动一个“胶片颗粒”滑块,看着画面突然蒙上一层灰蒙蒙的噪点,然后心里咯噔一下:这玩意儿真能用ÿ…...
解决VMware安装macOS后分辨率锁死的烦恼:手把手教你安装VMware Tools并自定义显示设置
突破VMware中macOS显示限制:从工具安装到完美适配的全流程指南 当你在VMware中成功安装macOS系统后,可能会立刻遇到一个令人沮丧的问题——屏幕分辨率被锁定在低分辨率状态,窗口无法自由缩放,操作体验大打折扣。这种显示限制不仅…...
告别低效编程:在PyCharm 2024.1中配置Baidu Comate的保姆级教程(含快捷键设置)
告别低效编程:在PyCharm 2024.1中配置Baidu Comate的保姆级教程(含快捷键设置) 作为一名长期使用PyCharm进行Python开发的工程师,我深刻体会到重复性编码工作对创造力的消耗。直到遇见Baidu Comate——这款能与IDE深度集成的AI编码…...
《流畅的Python》读书笔记07(补充03): 对象引用、可变性和垃圾回收 - 深复制循环引用内存安全机制解析
Python的copy.deepcopy()函数在处理循环引用时,通过内部的备忘录(memo)字典机制来打破无限递归,确保复制过程能够正确终止。这个memo字典本身的设计就考虑了内存管理的安全性,在正常情况下不会导致内存泄漏。其核心机制…...
索尼IMX811如何重塑工业视觉与专业影像的边界
突破像素极限,定义成像新高度在影像技术飞速发展的今天,高分辨率始终是专业领域不懈追求的目标。索尼半导体解决方案公司重磅推出的IMX811中画幅CMOS图像传感器,以2.47亿有效像素的惊人规格,为行业带来了颠覆性的突破。这款传感器…...
第一学期结果
关注 1.从安涛老师前三期视频中了解了方向2.从b站了解了555的内部结构3.仿真。4.低通滤波器的基本原理:一、核心定义只允许低频信号顺利通过,阻挡、衰减高频信号的电路。 你电路里作用:滤掉方波里的高频谐波,留下低频基波…...
复杂干扰下考虑异质性的非机动车微观行为建模与仿真【附仿真】
✨ 长期致力于非机动车微观交通行为、异质性、感知—决策—行动三阶段、社会力模型、模糊逻辑研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)非机动车…...
STM32 USB开发避坑指南:手把手教你读懂并配置端点描述符(附完整代码)
STM32 USB开发避坑指南:手把手教你读懂并配置端点描述符(附完整代码) 在嵌入式开发领域,USB通信一直是让工程师又爱又恨的技术。爱它的通用性和高速传输能力,恨它那晦涩难懂的协议栈和层出不穷的配置问题。特别是当项目…...
别再手搓动画了!用PS搞定微信小程序GIF单次播放(附2022版安装包)
微信小程序GIF动画高效制作指南:从PS设计到开发落地全流程 在微信小程序开发中,动画效果的实现往往让开发者陷入两难选择:要么花费大量时间手写Canvas动画代码,要么寻找更高效的视觉呈现方案。当遇到需要精确控制播放次数的动画需…...
RLHF工程化实践:用合成反馈替代人工标注的完整闭环
1. 这不是“替代人类”的口号,而是一套可落地的RLHF工程闭环“Build Your Own RLHF LLM — Forget Human Labelers!” 这个标题一出来,很多同行第一反应是皱眉——不是质疑技术可行性,而是警惕它背后可能隐含的简化主义陷阱。我带过三轮大模型…...
