在 Java 阵营中主要的 Mock 测试工具有 jMock,MockCreator,MockRunner,EasyMock, MockMaker 等
jMock 框架介绍
总体上来说,jMock 是一个轻量级的模拟对象技术的实现。它具有以下特点: 可以用简单易行的方法定义模拟对象,无需破坏本来的代码结构表; 可以定义对象之间的交互,从而增强测试的稳定性; 可以集成到测试框架; 易扩充; 与大多数 MOCK 框架一样,我们可以在 IDE 中使用并进行开发。本文以最常用的 Eclipse 为例。 下载 jMock
jmock.org/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 的对象用来代表上下文。上下文 可以模拟出对象和对象的输出,并且还可以检测应用是否合法。 1 2 3 4 5 6 7 8 } Mockery context = new Mockery(); public class AJmockTestCase { import org.jmock.Mockery; import org.jmock.Expectations;
然后我们创建一个 calcService 去模拟 ICalculatorService 接口。在这里我们以 add() 方法为例,我们针对 add() 方法定义预期值 assumedResult 。之后我们去调用 add(1,1) 时,就可以得到预期值。 9 10 11 12 13 14 15 16 17 }}); // expectations context.checking(new Expectations() {{ oneOf (calcService).add(1, 1); will(returnValue(assumedResult)); final int assumedResult = 2; // set up final ICalculatorService calcService = context.mock(ICalculatorService.class);
清单 3 和 4 分别显示了 ICalculatorService 和 AJmockTestCase 的代码。
清单 3. ICalculatorService 代码 18 public interface ICalculatorService { 19 20 21 22 23 清单 4. AJmockTestCase 代码 24 import org.jmock.Mockery; 25 26 27 28 29 Mockery context = new Mockery(); public class AJmockTestCase { import org.jmock.Expectations; } public int add(int a, int b);
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 } } System.out.println(calcService.add(1, 1)); }); } // expectations context.checking(new Expectations() { { oneOf(calcService).add(1, 1); will(returnValue(assumedResult)); final int assumedResult = 2; // set up final ICalculatorService calcService = context .mock(ICalculatorService.class); public void testCalcService() {
在 jMock 中,开发人员可以按照下面的语法定义预期值,从而实现更复杂的应用。例如我们可以模拟底层 驱动程序的输出,在上层应用
程序中使用这些模拟数据。具体可以参考 jMock 的官方网站。 52 invocation-count (mock-object).method(argument-constraints); 53 54 55 56 inSequence(sequence-name); when(state-machine.is(state-name)); will(action); then(state-machin
e.is(new-state-name));
EasyMock 框架介绍
在实际开发中,不少开发人员也使用 EasyMock 来进行测试驱动开发。 EasyMock 具有以下的特点 在运行时 (runtime) 改变方法名或参数顺序,测试代码不会破坏; 支持返回值和异常; 对于一个或多个虚拟对象,支持检查方法调用次序; 只支持
Java 5.0 及以上版本; 与大多数 MOCK 框架一样,我们可以在 IDE 中使用并进行开发。本文以最
常用的 Eclipse 为例。
下载 EasyMock
在 EasyMock 官方网站,我们可以下载当前稳定版本 EasyMock2.4 。 配置类路径
为了使用 EasyMock 2.4,您需要加入下面的 JAR 文件到当前的类路径。 easymock.jar 图 2. 已添加到 TestEasyMock 项目中 EasyMock 的 JAR 文件
使用 EasyMock 模拟接口
清单 5. ILEDCard 代码 57 public inter