模拟对象(Mock Object)测试驱动开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在Java 阵营中主要的Mock 测试工具有jMock,MockCreator,MockRunner,EasyMock,MockMaker 等
jMock 框架介绍
总体上来说,jMock 是一个轻量级的模拟对象技术的实现。它具有以下特点:
可以用简单易行的方法定义模拟对象,无需破坏本来的代码结构表;
可以定义对象之间的交互,从而增强测试的稳定性;
可以集成到测试框架;
易扩充;
与大多数MOCK 框架一样,我们可以在IDE 中使用并进行开发。本文以最常用的Eclipse 为例。
下载jMock
/download.html
在jMock 官方网站,我们可以下载当前稳定版本jMock2.5.1 。
配置类路径
为了使用jMock 2.5.1,您需要加入下面的JAR 文件到当前的类路径。
jmock-2.5.1.jar
hamcrest-core-1.1.jar
hamcrest-library-1.1.jar
图 1. 已添加到TestingExample 项目中jMock 的JAR 文件
使用jMock 模拟接口
我们首先必须引入jMock 的类,定义我们的测试类,创建一个Mockery 的对象用来代表上下文。上下文可以模拟出对象和对象的输出,并且还可以检测应用是否合法。
1import org.jmock.Mockery;
2import org.jmock.Expectations;
3
4public class AJmockTestCase {
5
6Mockery context = new Mockery();
7
8}
然后我们创建一个calcService 去模拟ICalculatorService 接口。在这里我们以add() 方法为例,我们针对add() 方法定义预期值assumedResult 。之后我们去调用add(1,1) 时,就可以得到预期值。
9// set up
10final ICalculatorService calcService = context.mock(ICalculatorService.class);
11
12final int assumedResult = 2;
13
14// expectations
15context.checking(new Expectations() {{
16oneOf (calcService).add(1, 1); will(returnValue(assumedResult));
17}});
清单 3 和4 分别显示了ICalculatorService 和AJmockTestCase 的代码。
清单 3. ICalculatorService 代码
18public interface ICalculatorService {
19
20public int add(int a, int b);
21
22}
23
清单 4. AJmockTestCase 代码
24import org.jmock.Mockery;
25import org.jmock.Expectations;
26
27public class AJmockTestCase {
28
29Mockery context = new Mockery();
30
31public void testCalcService() {
32
33// set up
34final ICalculatorService calcService = context
35.mock(ICalculatorService.class);
36
37final int assumedResult = 2;
38
39// expectations
40context.checking(new Expectations() {
41{
42oneOf(calcService).add(1, 1);
43will(returnValue(assumedResult));
44}
45});
46
47System.out.println(calcService.add(1, 1));
48
49}
50
51}
在jMock 中,开发人员可以按照下面的语法定义预期值,从而实现更复杂的应用。例如我们可以模拟底层驱动程序的输出,在上层应用程序中使用这些模拟数据。具体可以参考jMock 的官方网站。
52invocation-count (mock-object).method(argument-constraints);
53inSequence(sequence-name);
54when(state-machine.is(state-name));
55will(action);
56then(state-machine.is(new-state-name));
EasyMock 框架介绍
在实际开发中,不少开发人员也使用EasyMock 来进行测试驱动开发。EasyMock 具有以下的特点
在运行时(runtime) 改变方法名或参数顺序,测试代码不会破坏;
支持返回值和异常;
对于一个或多个虚拟对象,支持检查方法调用次序;
只支持Java 5.0 及以上版本;
与大多数MOCK 框架一样,我们可以在IDE 中使用并进行开发。本文以最常用的Eclipse 为例。
下载EasyMock
在EasyMock 官方网站,我们可以下载当前稳定版本EasyMock2.4 。
配置类路径