Java Mock测试工具比较
最近,在做一个Java Web的项目,项目中需要集成一套Mock测试工具。随即对市面上的mock测试工具进行了调研,下面是调研结果。其中,mock测试工具分为单元测试级别的mock工具和接口测试级别的mock工具。
1.单元测试级别的mock工具
目前,这个级别的mock工具有easymock、jMock、Mockito、Unitils Mock、PowerMock、JMockit等等.
关于它们的优劣势在JMockit官网上给出一个简单的比较,结果如下图所示。这个结果可能会偏向JMockit,我们可以作为参考。
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 |
就目前来讲,是mockit+powermock、JMockit这两种工具使用人数较多。JMockit的功能最为完善,mockit+powermock的用户体验相对较好一点。
2.接口测试级别的mock工具
接口级别的mock工具完成的主要功能是对一个用户的请求,模拟server返回一个接口的响应数据。目前,这类的主流mock工具主要有以下几种:
(1)Wiremock
github地址: https://github.com/tomakehurst/wiremock
特点:
- 支持Http响应头,匹配URL,heade和body内容模式
- 请求验证
- 可以作为一个独立的进程或者WAR app在单元测试中运行
- 可以通过Java API,Json文件和JSON over HTTP配置
- 有记录/回放功能
- Fault injection
- 可以作为请求检查和替换的浏览器代理
- 有状态的行为模拟
- 可配置响应延迟
(2)Mockserver
github地址:https://github.com/jamesdbloom/mockserver
特点:
- 能够mock HTTP或者HTTPS 的server或者服务
- 当一个请求匹配 expectation时能够返回一个mock response
- 当一个请求匹配 expectation时能够forward 一个请求
- 当一个请求匹配 expectation时能够执行一个回调(callback),允许动态地创建response
- 支持Request验证
(3)Moco
github地址:https://github.com/dreamhead/moco
特点:
- an easy setup stub framework.
- 支持HTTP、HTTPS、SOCKS
- 支持单元测试
(4)Mock.js
github地址:https://github.com/nuysoft/Mock/tree/refactoring
特点:
- 根据数据模板生成整合后的数据
- 对于Ajax请求提供request/response mocking
(5)RAP
github地址:https://github.com/thx/RAP
特点:
- Web接口管理工具,接口自动化,MOCK数据自动生成,自动化测试
- 能够通过分析接口结构自动生成Mock数据、校验真实接口的正确性
- 阿里产品,功能完善、结合了文档、Mock.js、可视化、Rest、接口过渡、文档修改提醒、支持本地部署。