Mock工具介绍
https://cloud.tencent.com/developer/article/1684199?from=article.detail.1465591
什么是Mock
如果将mock单独翻译过来,其意义为 “虚假、虚设”,因此在软件开发领域,我们也可以将其理解成 “虚假数据”,或者 “真实数据的替身”。
为什么使用Mock
1.解除依赖,团队并行工作
接口尚未开发完成,在系统交互双方定义好接口之后,我们可以提前进行开发和测试,并不依赖上游系统的开发实现。
2.开启TDD模式,即测试驱动开发
单元测试是TDD的基石,当接口定义好后,测试人员就可以创建一个Mock,把接口添加到自动化测试环境中,提前创建测试。
3.隔离系统
通过编写Mock,隔离请求操作(Get、Post)对于数据库中数据的污染。
4.提升测试覆盖度
通过Mock接口返回的不同状态,来查看系统是否能够正常影响,提升测试的覆盖度。
5.方便演示
通过使用Mock模拟数据接口,我们即可在只开发了UI的情况下,无须服务端的开发就可以进行产品的演示。
除此之外,Mock可以加深我们对测试的理解,深入明白测试“输入”和“输出”的不同表达形式,同时还能提高自身技术,脱离功能测试对于开发的依赖。
市面上常见的Mock工具
市面上常见的Mock分为单元测试级别的Mock工具和接口测试级别的Mock工具
单元测试级别的mock工具
单元测试级别的Mock工具有Easymock、jMock、Mockito、Unitils Mock、PowerMock、JMockit等。
EasyMock
EasyMock 是一套用于通过简单的方法对于给定的接口生成 Mock 对象的类库。它提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定的值或抛出指定异常。通过 EasyMock,我们可以方便的构造 Mock 对象从而使单元测试顺利进行。
JMock
JMock是一个使用模拟对象机制测试Java代码的开发包。模拟对象(Mock Object)可以取代真实对象的位置,用于测试一些与真实对象进行交互或依赖于真实对象的功能,模拟对象的背后目的就是创建一个轻量级的、可控制的对象来代替测试中需要的真实对象,模拟真实对象的行为和功能,方便我们的测试。JMock就是这种机制的实现,使用JMock我们可以快速创建模拟对象,定义交互过程中的约束条件等,同时JMock也是易扩展的,你可以很方便添加自定义的需求。
Mockito
Mockito 无需准备昂贵的前期启动。他们的目标是透明的,让开发人员专注于测试选定的行为。
Mockito 拥有的非常少的 API,所有开始使用 Mockito,几乎没有时间成本。因为只有一种创造 mock 的方式。只要记住,在执行前 stub,而后在交互中验证。你很快就会发现这样 TDD java 代码是多么自然。
单元测试Mock工具对比
Features:
Feature |
EasyMock |
jMock |
Mockito |
UnitilsMock |
PowerMock(EasyMock) |
PowerMock(Mockito) |
JMockit |
---|---|---|---|---|---|---|---|
Invocation count constraints(调用数限制) |
√ |
√ |
√ |
√ |
√ |
√ |
|
Recording strict expectations(记录严格的预期结果) |
√ |
√ |
√ |
√ |
|||
Explicit verification(显式验证) |
√ |
√ |
√ |
√ |
|||
Partial mocking(部分mock) |
√ |
√ |
√ |
√ |
√ |
√ |
|
Easier argument matching based on properties of value objects(基于值对象属性的简化参数匹配) |
√ |
√ |
√ |
√ |
√ |
√ |
|
Cascading mocks(级联mock) |
√ |
√ |
√ |
√ |
|||
Mocking of multiple interfaces(多接口mock) |
√ |
√ |
√ |
||||
Mocking of annotation types(注释类型mock) |
√ |
√ |
√ |
√ |
√ |
||
Partially ordered expectations |
√ |
√ |
|||||
Auto-injection of mocks(mock的自动注入) |
√ |
√ |
√ |
√ |
|||
Mocking of enums(枚举的mock) |
√ |
√ |
√ |
||||
Declarative mocks for test methods (mock parameters) |
√ |
||||||
Mocking of unspecified implementation classes(未实现接口类的mock) |
√ |
||||||
“Duck typing” fakes for integration tests |
√ |
||||||
Total |
4/14 |
4/14 |
8/14 |
6/14 |
5/14 |
9/14 |
14/14 |
Qualities:
Feature |
EasyMock |
jMock |
Mockito |
UnitilsMock |
PowerMock(EasyMock) |
PowerMock(Mockito) |
JMockit |
---|---|---|---|---|---|---|---|
Argument matchers for some parameters only, not all |
√ |
√ |
|||||
No method call to switch from record to replay(切换记录回放时无方法调用) |
√ |
√ |
√ |
√ |
|||
No extra code for implicit verification(隐式验证没有额外代码) |
N/A |
N/A |
N/A |
√ |
|||
No extra “prepare for test” code(没有额外的”prepare for test”代码) |
√ |
√ |
√ |
√ |
√ |
||
No need to use @RunWith annotation or base test class(不需要用@runwith注解和测试基类) |
√ |
√ |
√ |
√ |
|||
Consistent syntax between void and non-void methods(空和非空方法的语法一致) |
√ |
√ |
√ |
||||
Mocking of constructors and final/static/private methods(构造函数、final、static和private方法的mock) |
√ |
√ |
√ |
||||
Mocking of “new-ed” objects(“new-ed”对象的mock) |
√ |
√ |
√ |
||||
Support for covariant return types |
√ |
||||||
Single jar file in the classpath is sufficient to use mocking API(在classpath中的单个jar文件就能够使用mockAPI |
√ |
N/A |
N/A |
√ |
|||
Total |
2/10 |
3/10 |
4/9 |
4/9 |
2/9 |
3/8 |
10/10 |
接口测试级别的mock工具
接口测试级别的Mock工具有RAP、Yapi、Moco等。
RAP
RAP是阿里团队出的一款接口管理工具,帮助开发人员有效的管理接口文档。包括阿里集团在内的三百五十多个企业都在使用RAP管理重要的接口文档。
- Web接口管理工具,接口自动化,MOCK数据自动生成,自动化测试
- 能够通过分析接口结构自动生成Mock数据、校验真实接口的正确性
- 阿里产品,功能完善、结合了文档、Mock.js、可视化、Rest、接口过渡、文档修改提醒、支持本地部署
Yapi
YApi是去哪儿网移动架构组开发的一个开源项目,YApi的 Mock 功能可以根据用户的输入接口信息如协议、URL、接口名、请求头、请求参数、返回数据、生成 Mock 接口,这些接口会自动生成模拟数据,创建者可以自由构造需要的数据。mock模拟数据基于mock.js。
Mock.js 是一款模拟数据生成器,旨在帮助前端独立于后端进行开发,帮助编写单元测试。提供了以下模拟功能:
- 根据数据模板生成模拟数据
- 模拟 Ajax 请求,生成并返回模拟数据
- 基于 HTML 模板生成模拟数据
Moco
Moco 是一个简单搭建 stub 的框架,主要用于测试和集成。
Moco本身支持API和独立运行两种方式。通过使用API,开发人员可以在JUnit、JBehave等测试测试框架里使用Moco,极大程度地降低了集成点测试的复杂度
Moco可以提供以下服务:
- HTTP APIs
- Socket APIs
- REST API
接口测试Mock工具对比
Yapi |
Rap |
Moco | |
---|---|---|---|
方便集成 |
√ |
√ |
× |
Mock简便性 |
√ |
√ |
√ |
文档管理 |
√ |
× |
× |
开源程度 |
√ |
√ |
√ |
部署难度 |
低 |
高 |
低 |
可视化界面 |
√ |
√ |
× |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)