注:EasyMock2.0+只支持JDK1.5+,因为其代码中用到了很多新增特性,比如for(:)、method(...)等用法。EasyMock最初的1.0版本似乎支持对实体类的模拟,但是貌似在很面的版本中和快就取消了这个功能。
EasyMock provides Mock Objects for interfaces in JUnit tests by generating them on the fly using Java's proxy mechanism. Due to EasyMock's unique style of recording expectations, most refactorings will not affect the Mock Objects. So EasyMock is a perfect fit for Test-Driven Development.
EasyMock是用于JUnit中的虚拟测试辅助包,它提供对interface类的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令mock对象返回指定的值或抛出指定异常。
一点补充
对于recorder期的方法调用还有一些设定调用次数的方法比较重要,可能会用到,比如说times(),可以设定调用出现的次数使用方法类似andReturn(value)
expect(***).times(3); //指定这个方法调用出现三次
相当于
expect(***);
expect(***);
expect(***);
还可以设定它出现的次数为不封顶,或在一个范围之内,这些方法都可以在MocksControl类中找到
times(int);
times(min , max); //将max设为整数最大值就是不封顶,其实设大点也就够用了
anyTimes();
once();
杂谈EasyMock内部原理
看了一天半的时间,对他的原理有了一些认识,但是还不全面,对一些深层的原理还了解得不太清楚,先简单谈一谈目前的认识,很可能会有很多错误的地方,如果以后发现,会陆续修改。
EasyMock是利用线程来捕获mock对象函数调用的,所以他特别有一个LastControl类,里面有三个成员, 用于将线程与三个不同的类相关联,matcher是匹配器、argument是入口参数、control中含有大部分主要内容。
private static final WeakHashMap<Thread, MocksControl> threadToControl
= new WeakHashMap<Thread, MocksControl>();
private static final WeakHashMap<Thread, Stack<Object[]>> threadToCurrentArguments
= new WeakHashMap<Thread, Stack<Object[]>>();
private static final WeakHashMap<Thread, Stack<IArgumentMatcher>> threadToArgumentMatcherStack
= new WeakHashMap<Thread, Stack<IArgumentMatcher>>();
困惑:matcher和argument应该都是和指定的Invocation相关联,但是这里只存了control,而一个control可以有多个mock,一个mock又能有多个method过程,怎样确定matcher、argument和method的对应关系?是通过线程实现的么?
他将recorder到的method及其参数、times都记录到线性表中,而replay的对应method、参数、times也都记录下来,进行对比,从而实现verify()功能。
Invocation对应一次具体的方法调用过程,可能包含返回值Result。
与之对应的ExpectedInvocation系列类加入了matcher和result,也就是加入了预期的功能。
UnorderedBehavior是最底层的Behavior类,其中主要有addExpected()和addActual ()两个方法,应该可以完成预期的保存和检验两个功能。他有一个ExpectedInvocationAndResults的List,可以记录一些列的 方法预期,可以指定应记录一个mock,但是这点还没有证实。
recorder和replay都是主要靠IMocksControlState接口的实现类:RecorderState和ReplayState,各司其职。
RecorderState的成员是:ExpectedInvocation lastInvocation、Result lastResult、IMocksBehavior behavior behavior用于记录所有提交进来的ExpectedInvocation,而那两个lastXXX,应该是用于保留最后一条记录。verify()方法会直接抛出异常:calling verify is not allowed in record state
ReplayState只有一个IMocksBehavior behavior成员,方法也只有invoke()和verify()不会直接抛出异常。应该是像其名称一样专门用于处理replay时期的验证的
相关推荐
EasyMock单元测试的扩展; EasyMock简介(抽象类接口做测试); EasyMock来进行测试; EasyMock如何打桩; EasyMock实践指南;...EasyMock使用技巧;...EasyMock使用说明; EasyMock使用手记; 用Mock object进行隔离测试;
EasyMock单元测试的扩展; EasyMock简介(抽象类接口做测试); EasyMock来进行测试; EasyMock如何打桩; EasyMock实践指南; EasyMock使用技巧;...EasyMock使用说明; EasyMock使用手记; 用Mock object进行隔离测试;
本文将对 EasyMock 的功能和原理进行介绍,并通过示例来说明如何使用 EasyMock 进行单元测试。 Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与...
为了部署和使用EasyMock,你需要将源码导入一个支持Java开发的IDE(如Eclipse或IntelliJ IDEA),然后按照提供的说明进行编译和配置。 在部署流程中,一般步骤如下: 1. 安装Node.js:访问官网下载Windows安装包,...
本文将详细讲解如何使用 Easymock 对 Servlet 进行单元测试,特别是针对 `HttpServletRequest` 中获取参数的方法 `getParamsNames()`。 在Servlet编程中,`HttpServletRequest` 是一个核心接口,它提供了处理HTTP...
Easymock是一款广泛使用的Java单元测试框架,它允许开发者创建和控制模拟对象,以便在测试过程中隔离被测代码,确保测试的准确性。本教程旨在帮助初学者快速掌握Easymock的基本用法和核心概念。 一、Easymock简介 ...
在使用过程中,开发者需要按照工具提供的说明文档,逐步执行迁移步骤,确保所有必要的数据和配置都被正确地转移到本地。 在实际操作中,项目迁移通常涉及以下几个关键步骤: 1. 数据备份:首先,需要从线上环境中...
- **README**:可能提供项目简介、安装和使用说明。 ### Easymock与其它模拟框架对比 Easymock与其他模拟框架如Mockito相比,各有优势。Mockito更注重代码的可读性和简洁性,提供了更丰富的API,而Easymock则更适合...
EasyMock是一个流行的开源Java库,它允许开发者创建和使用模拟对象来测试代码,而无需实际实现接口或类。这个存储库可能是为了保存和整理在GitHub上无法直接托管的非图像二进制附件,如源代码、日志文件、测试用例或...
2.easymock的使用实例 3.mockito的使用实例 版本库地址 HTTPS协议: https://github.com/ichunming/junit.git SSH协议: git@github.com:ichunming/junit.git 克隆版本库 操作示例:`$ git clone git@github....
中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...
中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...
中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...
中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...
中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...
中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...
中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...
中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...
中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...
中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-...