Java代码质量检查工具及使用案例( 五 )


Mock Object的使用通常会带来以下一些好处:
隔绝其他模块出错引起本模块的测试错误 。
隔绝其他模块的开发状态,只要定义好接口,不用管他们开发有没有完成 。
一些速度较慢的操作,可以用MockObject代替,快速返回 。
对于分布式系统的测试,使用Mock Object会有另外两项很重要的收益:
通过Mock Object可以将一些分布式测试转化为本地的测试
将Mock用于压力测试,可以解决测试集群无法模拟线上集群大规模下的压力
mock技术的目的和作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开 。
Mock应用场景
在使用Mock的过程中,发现Mock是有一些通用性的,对于一些应用场景,是非常适合使用Mock的:
真实对象具有不可确定的行为(产生不可预测的结果,如股票的行情)
真实对象很难被创建(比如具体的web容器)
真实对象的某些行为很难触发(比如网络错误)
真实情况令程序的运行速度很慢
真实对象有用户界面
测试需要询问真实对象它是如何被调用的(比如测试可能需要验证某个回调函数是否被调用了)
真实对象实际上并不存在(当需要和其他开发小组,或者新的硬件系统打交道的时候,这是一个普遍的问题)
当然,也有一些不得不Mock的场景:
一些比较难构造的Object:这类Object通常有很多依赖,在单元测试中构造出这样类通常花费的成本太大 。
执行操作的时间较长Object:有一些Object的操作费时,而被测对象依赖于这一个操作的执行结果,例如大文件写操作,数据的更新等等,出于测试的需求,通常将这类操作进行Mock 。
异常逻辑:一些异常的逻辑往往在正常测试中是很难触发的,通过Mock可以人为的控制触发异常逻辑 。
在一些压力测试的场景下,也不得不使用Mock,例如在分布式系统测试中,通常需要测试一些单点(如namenode,jobtracker)在压力场景下的工作是否正常 。而通常测试集群在正常逻辑下无法提供足够的压力(主要原因是受限于机器数量),这时候就需要应用Mock去满足 。
在这些场景下,我们应该如何去做Mock的工作了,一些现有的Mock工具可以帮助我们进行Mock工作 。
EasyMock应用
Easymock官网:
http://easymock.org/
EasyMock 是早期比较流行的MocK测试框架 。它提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定的值或抛出指定异常 。通过 EasyMock,我们可以方便的构造 Mock 对象从而使单元测试顺利进行 。
EasyMock 是采用 MIT license 的一个开源项目
使用EasyMock大致可以划分为以下几个步骤:
① 使用 EasyMock 生成 Mock 对象;
② 录制 Mock 对象的预期行为和输出;
③ 将 Mock 对象切换到 播放 状态;
④ 调用 Mock 对象方法进行单元测试;
⑤ 对 Mock 对象的行为进行验证 。
mockito应用
mockito官网
https://code.google.com/p/mockito/
由于官网上不了,可以到csdn上下载
http://download.csdn.net/download /wjjiang917/5519381
是EasyMock之后流行的mock工具 。相对EasyMock学习成本低,而且具有非常简洁的API,测试代码的可读性很高 。
使用mockito大致可以划分为以下几个步骤:
① 使用 mockito 生成 Mock 对象;
② 定义(并非录制) Mock 对象的行为和输出(expectations部分);
③ 调用 Mock 对象方法进行单元测试;
④ 对 Mock 对象的行为进行验证 。
PowerMock应用
PowerMock官网
https://code.google.com/p/powermock/
这个工具是在EasyMock和Mockito上扩展出来的,目的是为了解决EasyMock和Mockito不能解决的问题,比如对static, final, private方法均不能mock 。其实测试架构设计良好的代码,一般并不需要这些功能,但如果是在已有项目上增加单元测试,老代码有问题且不能改时,就不得不使用这些功能了 。
PowerMock 在扩展功能时完全采用和被扩展的框架相同的API, 熟悉 PowerMock 所支持的模拟框架的开发者会发现 PowerMock 非常容易上手 。PowerMock 的目的就是在当前已经被大家所熟悉的接口上通过添加极少的方法和注释来实现额外的功能 。目前PowerMock 仅扩展了 EasyMock 和 mockito,需要和EasyMock或Mockito配合一起使用 。
因为内容实在是太多了,小编在此就不做过多的介绍了,想了解更多的Java知识可以关注小编!

【Java代码质量检查工具及使用案例】


推荐阅读