史上最全,一篇文章搞定Mock原理及应用
目录
一、Mock基础知识
什么是Mock
Mock的目的
Mock的应用场景
Mock框架对比(JAVA)
二、Mockito研究
主要资源
环境起步
核心注解
常用方法
三、MockMVC研究
使用目的
环境起步
运行配置
运行机制
创建Builder
方法解析
四、Mock实例
MockMVC实例
Mockito实例
附录:参考文档一览
一、Mock基础知识
什么是Mock
Mock 是在测试过程中,对于一些不容易构造/获取的对象,创建一个Mock 对象来模拟对象的行为。Mock 最大的功能是帮你把单元测试进行解耦,如果你的代码对另一个类或者接口有依赖,它能够帮你模拟这些依赖,并帮你验证所调用的依赖的行为。
Mock的目的
验证这个对象的某些方法的调用情况,调用了多少次,参数是什么,返回值是什么等等
指定这个对象的某些方法的行为,返回特定的值,或者是执行特定的动作等等
Mock的应用场景
团队并行开发,有了Mock,前、后端人员只需要定义好接口文档就可以开始并行工作,互不影响。后端与后端之间如果有接口耦合,也同样使用Mock解决。
开启TDD模式,即测试驱动开发。单元测试是TDD实现的基石,而TDD经常会碰到协同模块尚未开发完成的情况,但是有了mock,这些一切都不是问题。当接口定义好后,测试人员就可以创建一个Mock,把接口添加到自动化测试环境,提前创建测试。
隔离系统,假如需要调用一个post请求,为了获得响应,来看当前系统是否能正确处理返回的“响应”,但是这个post请求会造成数据库中数据的污染,那么就可以充分利用Mock,构造一个虚拟的post请求,指定返回的数据就OK。
模拟访问资源,比如说,你需要调用一个“墙”外的资源来方便自己调试,就可以自己Mock一个。
系统演示,假如我们需要创建一个演示系统,并且做了简单的UI,那么在完全没有开发后端服务的情况下,也可以进行演示。
测试场景
接口测试**:对一个接口进行测试,排除这个接口对外部环境的依赖,避免因外部资源而导致测试失败。
功能测试:在功能测试初期,我们往往依赖到第三方提供的接口,但是第三方接口初期是不稳定的(虽然前期已做好服务接口的约定),后期当有较稳定的接口后,我们进行全面地测试,则接口的功能都正常了。如果数据准备比较麻烦或者造数据要双方配合成本比较高的项目,在对外部接口进行第一次全面联调测试后,仍然可以考虑使用mock来全面测试自己内部的功能逻辑。
UI自动化测试:对数据源进行mock,UI自动化测试时,页面上展示的信息是来源于其他的数据源。
测试覆盖度,假如有一个接口,有100个不同类型的返回,我们需要测试它在不同返回类型下,系统是否能够正常响应,但是有些返回在正常情况下基本不会发生,难道你要千方百计给系统做各种手脚让它返回以便测试吗?比如,我们需要测试在当接口发生500错误的时候,app是否崩溃,别告诉我你一定要给服务端代码做些手脚让它返回500 。而使用mock,这一切就都好办了,想要什么返回就模拟什么返回,妈妈再也不用担心我的测试覆盖度了!
Mock框架对比(JAVA)
框架 | 简介 | 说明 |
---|---|---|
EasyMock | EasyMock 是早期比较流行的MocK测试框架。它提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定的值或抛出指定异常。通过 EasyMock,我们可以方便的构造 Mock 对象从而使单元测试顺利进行。 | |
Mockito | EasyMock之后流行的mock工具。它与EasyMock和jMock很相似,但是通过在执行后校验什么已经被调用,它消除了对期望行为(expectations)的需要。其它的mocking库需要你在执行前记录期望行为(expectations),而这导致了丑陋的初始化代码。 | 相对EasyMock学习成本低,而且具有非常简洁的API,测试代码的可读性很高。 |
PowerMock | 这个工具是在EasyMock和Mockito上扩展出来的,目的是为了解决EasyMock和Mockito不能解决的问题,比如对static, final, private方法均不能mock。其实测试架构设计良好的代码,一般并不需要这些功能,但如果是在已有项目上增加单元测试,老代码有问题且不能改时,就不得不使用这些功能了。 | PowerMock 在扩展功能时完全采用和被扩展的框架相同的 API, 熟悉 PowerMock 所支持的模拟框架的开发者会发现 PowerMock 非常容易上手。PowerMock 的目的就是在当前已经被大家所熟悉的接口上通过添加极少的方法和注释来实现额外的功能。目前PowerMock 仅扩展了 EasyMock 和 mockito,需要和EasyMock或Mockito配合一起使用。 |
Jmockit | JMockit 是一个轻量级的mock框架是用以帮助开发人员编写测试程序的一组工具和API,该项目完全基于 Jav |