模拟对象(Mock Object)测试驱动开发

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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 。

配置类路径

相关文档
最新文档