无论是敏捷开发、持续交付,还是测试驱动开发(TDD)都把单元测试作为实现的基石。随着这些先进的编程开发模式日益深入人心,单元测试如今显得越来越重要了。在敏捷开发、持续交付中要求单元测试一定要快(不能访问实际的文件系统或数据库),而TDD经常会碰到协同模块尚未开发的情况,而mock技术正是解决这些问题的灵丹妙药。
mock技术的目的和作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开。
我们可以自己编写自定义的Mock对象实现mock技术,但是编写自定义的Mock对象需要额外的编码工作,同时也可能引入错误。现在实现mock技术的优秀开源框架有很多,本文对几个典型的mock测试框架作了简明介绍,希望对大家有所帮助。
1.EasyMock
EasyMock 是早期比较流行的MocK测试框架。它提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定的值或抛出指定异常。通过 EasyMock,我们可以方便的构造 Mock 对象从而使单元测试顺利进行。
EasyMock 是采用 MIT license 的一个开源项目,可以在 Sourceforge 上下载到。(http://sourceforge.net/projects/easymock/files/EasyMock/)
如果使用maven也可以如下引入:
<dependency><groupId>org.easymock</groupId><artifactId>easymock</artifactId><version>3.1</version><scope>test</scope></dependency>
使用EasyMock大致可以划分为以下几个步骤:
① 使用 EasyMock 生成 Mock 对象;
② 录制 Mock 对象的预期行为和输出;
③ 将 Mock 对象切换到 播放 状态;
④ 调用 Mock 对象方法进行单元测试;
⑤ 对 Mock 对象的行为进行验证。
现在用一个例子来简单呈现以上的步骤,假设有一个类需要被模拟的类如下:
publicclassClass1Mocked { publicString hello(String name){ System.out.println("hello "+name);return"hello "+name; }publicvoidshow(){ System.out.println("Class1Mocked.show()"); } }
首先静态导入EasyMock的方法:
importstaticorg.easymock.EasyMock.*;
例1.1 EasyMock第一个例子
@TestpublicvoidtestMockMethod() { Class1Mocked obj= createMock(Class1Mocked.class);① expect(obj.hello("z3")).andReturn("hello l4");② replay(obj);③ String actual= obj.hello("z3");④ assertEquals("hello l4", actual); verify(obj);⑤ }