EasyMock 是如何为一个特定的接口动态创建 Mock 对象,并记录 Mock 对象预期行为的呢?其实,EasyMock 后台处理的主要原理是利用 java.lang.reflect.Proxy 为指定的接口创建一个动态代理,这个动态代理,就是我们在编码中用到的 Mock 对象。EasyMock 还为这个动态代理提供了一个 InvocationHandler 接口的实现,这个实现类的主要功能就是将动态代理的预期行为记录在某个映射表中和在实际调用时从这个映射表中取出预期输出。
和开发人员联系最紧密的是 EasyMock 类,这个类提供了 createMock、replay、verify 等方法以及所有预定义的参数匹配器。
我们知道 Mock 对象有两种创建方式:一种是通过 EasyMock 类提供的 createMock 方法创建,另一种是通过 EasyMock 类的 createControl 方法得到一个 IMocksControl 实例,再由这个 IMocksControl 实例创建 Mock 对象。其实,无论通过哪种方法获得 Mock 对象,EasyMock 都会生成一个 IMocksControl 的实例,只不过第一种方式中的 IMocksControl 的实例对开发人员不可见而已。这个 IMocksControl 的实例,其实就是 MocksControl 类的一个对象。MocksControl 类提供了 andReturn、andThrow、times、createMock 等方法。
MocksControl 类中包含了两个重要的成员变量,分别是接口 IMocksBehavior 和 IMocksControlState 的实例。其中,IMocksBehavior 的实现类 MocksBehavior 是 EasyMock 的核心类,它保存着一个 ExpectedInvocationAndResult 对象的一个列表,而 ExpectedInvocationAndResult 对象中包含着 Mock 对象方法调用和预期结果的映射。MocksBehavior 类提供了 addExpected 和 addActual 方法用于添加预期行为和实际调用。
MocksControl 类中包含的另一个成员变量是 IMocksControlState 实例。IMocksControlState 拥有两个不同的实现类:RecordState 和 ReplayState。顾名思义,RecordState 是 Mock 对象在 Record 状态时的支持类,它提供了 invoke 方法在 Record 状态下的实现。此外,它还提供了 andReturn、andThrow、times 等方法的实现。ReplayState 是 Mock 对象在 Replay 状态下的支持类,它提供了 invoke 方法在 Replay 状态下的实现。在 ReplayState 中,andReturn、andThrow、times 等方法的实现都是抛出IllegalStateException,因为在 Replay 阶段,开发人员不应该再调用这些方法。
当我们调用 MocksControl 的 createMock 方法时,该方法首先会生成一个 JavaProxyFactory 类的对象。JavaProxyFactory 是接口 IProxyFactory 的实现类,它的主要功能就是通过 java.lang.reflect.Proxy 对指定的接口创建动态代理实例,也就是开发人员在外部看到的 Mock 对象。
在创建动态代理的同时,应当提供 InvocationHandler 的实现类。MockInvocationHandler 实现了这个接口,它的 invoke 方法主要的功能是根据 Mock 对象状态的不同而分别调用 RecordState 的 invoke 实现或是 ReplayState 的 invoke 实现。
http://www.ibm.com/developerworks/cn/opensource/os-cn-easymock/index.html
- 描述: EasyMock主要功能类
- 大小: 42.4 KB
分享到:
相关推荐
EasyMock是一款强大的模拟框架,主要用于Java单元测试。它允许开发者创建和控制对象的模拟行为,以便在测试过程中隔离被测试代码。在这个“EasyMock的安装与部署所需全部文件.zip”压缩包中,包含了在Windows环境下...
EasyMock 是一个强大的Java模拟框架,它允许开发者在单元测试中创建和控制对象的行为,以模拟复杂的依赖关系。这个框架的出现使得测试更加简洁、独立,可以有效地验证代码的正确性,而无需运行实际的依赖服务或库。...
Easymock是一个流行的Java单元测试框架,它允许开发者创建模拟对象来测试代码。这个框架使得测试更加简单,因为你可以模拟任何复杂的交互和行为,而无需实际运行依赖的组件。在给定的压缩包文件中,包含两个核心的...
EasyMock 3.2 是一个流行的开源Java模拟框架,它为开发者提供了强大的单元测试支持。在Java开发中,单元测试是验证代码独立模块正确性的关键步骤。EasyMock可以帮助程序员模拟对象的行为,使得测试过程更加可控,...
EasyMock主要是为测试提供模拟数据,比如你可以模拟HttpServletRequest。
EasyMock是Java编程中的一款强大的模拟框架,它允许开发者在单元测试中创建和控制对象的行为,以便于测试代码的特定部分。本手册主要关注的是EasyMock的2.4版本,这是一个广泛使用的版本,包含了丰富的功能和改进。...
【EasyMock介绍】 EasyMock是一款强大的Java模拟框架,它允许开发者在进行单元测试时创建和控制对象的行为。这个工具使得测试更加独立,可以隔离被测试代码与其他依赖的系统,从而提高测试的效率和质量。EasyMock的...
EasyMock 是一个强大的开源Java模拟框架,用于进行单元测试。它允许开发者创建模拟对象来代替真实的依赖,以便在测试过程中可以完全控制它们的行为。在这个"EasyMock 使用案例(含lib)"中,我们将会深入探讨如何...
EasyMock 是一个强大的开源工具,专门用于生成模拟对象(Mock Objects),在软件开发特别是单元测试领域,它扮演着至关重要的角色。这个工具的版本为2.5.2,提供了对Java编程语言的支持,使得开发者能够方便地创建和...
5. **扩展EasyMock**:EasyMock还可以与其它库结合,如`EasyMock.ClassExtender`用于创建扩展已有的类的模拟对象。 6. **Nice Mocks 和 Strict Mocks**:Nice Mocks默认允许所有未预期的调用,而Strict Mocks则会抛...
Easymock是一款强大的Java单元测试工具,它允许开发者创建模拟对象来协助测试代码。这款框架使得测试变得简单,因为它可以模拟任何接口的行为,而无需实际实现这些接口。下面我们将详细探讨Easymock的基本概念、工作...
在单元测试领域,Easymock和PowerMock是两个非常重要的工具,它们允许开发者模拟复杂的对象行为以便于测试。这两个库都是JUnit框架的扩展,帮助我们编写更清晰、更易于维护的测试代码。 Easymock3.1是Easymock的一...
EasyMock 是一个流行的 Java 单元测试框架,它帮助开发者创建模拟对象来测试目标类的行为。这篇文档将深入探讨 EasyMock 的使用方法和原理,以便更好地理解和应用这一工具。 首先,让我们理解 EasyMock 的核心概念...
Easymock是一款强大的Java单元测试工具,它允许开发者创建模拟对象来测试代码。这个压缩包包含的是Easymock的3.2版本,其中包括文档、源码和示例,对于学习和理解Easymock的工作原理以及如何在实际项目中使用它非常...
EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。本文将对 EasyMock 的功能和原理进行介绍,并通过示例来说明如何使用 EasyMock 进行单元测试。 ...
而JMock和EasyMock则是两种广泛使用的Java单元测试框架,它们允许开发者模拟对象的行为和交互,以便于测试复杂的系统。本资源包含JMock 2.5.1和EasyMock 3.0的库文件,使得开发者在进行单元测试时无需再四处寻找相关...
《深入理解easymock.jar:Java单元测试的利器》 在软件开发中,单元测试是一种重要的质量保证手段,它允许开发者验证代码的各个部分独立工作是否正常。Easymock是一个流行的Java模拟框架,其核心是easymock.jar库,...