背景:
EasyMock 2 版本必须要 JDK5 才能使用 EasyMock 1.2 可以在 JDK 1.4 使用
也可以使用 Retrotranslator 将 EasyMock 2 版本改为 JDK 1.4 也可以使用的。
目前使用的是 EasyMock 2.2
准备:
先弄个接口 Haha 用来 Mock 的,两个方法
void haha(String s);
String hehe(String s);
开始 Mock:
静态导入 EasyMock
import static org.easymock.EasyMock.*;
然后
Haha haha=createMock(Haha.class);
无返回值的调用可以直接调用 Mock 方法
haha.haha("haha");
有返回值的可以
expect(haha.hehe("hehe")).andReturn("ok");
这样做完后
你要 replay(haha); 一下,表示录完 mock ,准备重放了。
就可以调用 haha.haha("haha") 了,同样的,调用 haha.hehe("hehe") 的返回值是 "ok"
全部调用完了,使用 verify(haha); 查看一下预期的调用是不是都调了,如果预期要调用一次,却没调,那就会 AssertionError 哦。
调用次数
上面这些都是默认调用一次,就相当于 expect(haha.hehe("hehe")).andReturn("ok").times(1); 或 expect(haha.hehe("hehe")).andReturn("ok").once();
如果想调用任意次,就 expect(haha.hehe("hehe")).andReturn("ok").anyTimes();
如果想最少调用一次,就 expect(haha.hehe("hehe")).andReturn("ok").atLeastOnce();
如果想调用 1 至 3 次,就 expect(haha.hehe("hehe")).andReturn("ok").times(1,3);
预期的结果
还可以 expect(haha.hehe("hehe")).andReturn("ok").andReturn("ok too").andThrow(new RuntimeException());
这样,第一次调用 haha.hehe("hehe") 时返回 "ok" ,第二次返回 "ok too",第三次调用就比较惨了,会抛出一个 RuntimeException,需要注意的是,如果抛出的异常是 unchecked 的,就是 Runtime 的,就随便抛,如果是 checked 的,那就一定要抛这个方法定义的,否则会在 andThrow 这行出 IllegalArgumentException 。
终极解决办法还可以使用 andAnswer(IAnswer<T> answer) 传一个实现 IAnswer 接口的实例,这个接口只有一个方法
T answer() throws Throwable;
随便你返回什么,或是抛出什么异常。
调用顺序
不过如上面所说,haha.haha("haha") 与 haha.hehe("hehe") 是没有顺序的,将 createMock 改成 createStrictMock 或在 createMock 后面加一行 checkOrder(haha,true) 就可以了,这时,就一定要按照定义的顺序来调用了。
如果多个不同的 mock 也要保证顺序呢?那就不能使用 createMock 来创建这些 mock 了,因为每次 createMock 都会使用一个新的 IMocksControl 实例来单独控制这个 mock ,我们希望将多个 mock 用同一个 IMocksControl 控制,只需要
IMocksControl ctrl = createStrictControl();
Haha haha1= ctrl.createMock(Haha .class);
Haha haha2 = ctrl.createMock(Haha .class);
haha1.haha("haha1");
haha2.haha("haha2");
ctrl.replay();
就可以了
预期的参数
刚才 haha.haha("haha") 中的 "haha" 就是预期的参数,EasyMock 提供了很多预期参数的方法,比如 haha.haha(eq("haha")),与前面的方法功能完全一样
haha.haha((String)anyObject) 随便你传什么参数都没问题。
haha.haha(not(eq("haha"))) 这个只要不传 haha ,其它什么都成
同样可以自定义,只要调用 public static void reportMatcher(IArgumentMatcher matcher) 方法,将自定义的 IArgumentMatcher 传进去就可以了,这个接口有两个方法 boolean matches(Object argument) 和 void appendTo(StringBuffer buffer) 第一个方法的参数是调用实际传入的值,返回是否匹配,第二个方法是错误时向 buffer 中 append 错误信息。
将方法弄成 Stub
Stub 方法,我想应该就是随便调,爱怎么调就怎么调,返回的都是那个值,最后也不会验证到底调用了多少次。
如果想把一个方法弄成 Stub,无返回值的只要 asStub() 就是 expect(haha.haha("haha")).asStub() ,有返回值的就 andStubReturn() , andStubAnswer() 这样就可以了。
友好的Mock
我们使用 createMock 创建出来的 mock 对象,如果没有录过,调用这个方法都会出 AssertionError ,但如果使用 createNiceMock 就不会了,会返回 0 , null , false 这样的。
分享到:
相关推荐
使用EasyMock做java单元测试的例子,包含所需要的jar包
EasyMock单元测试的扩展; EasyMock简介(抽象类接口做测试); EasyMock来进行测试; EasyMock如何打桩;...EasyMock使用技巧; EasyMock使用简明手册; EasyMock使用说明; EasyMock使用手记; 用Mock object进行隔离测试;
easymock2 EasyMock使用简明手册
EasyMock 使用方EEasyMock 使用方法与原理剖析.rar
easymock 的使用方法简介easymock 的使用方法简介
还在为EasyMock使用时出异常而烦恼? 本压缩包包含除了Junit4之外easyMock3.1所用到的所有相关jar包,junit4可自己导入eclipse自带的即可 本压缩包包括: asm.jar cglib.jar objenesis.jar等 其中asm与cglib已兼容,放心...
EasyMock使用教程,快来看看你还有什么秘密没有发现吧!
本文将对 EasyMock 的功能和原理进行介绍,并通过示例来说明如何使用 EasyMock 进行单元测试。 Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与...
easyMock
EasyMock单元测试的扩展; EasyMock简介(抽象类接口做测试); EasyMock来进行测试; EasyMock如何打桩;...EasyMock使用技巧; EasyMock使用简明手册; EasyMock使用说明; EasyMock使用手记; 用Mock object进行隔离测试;
IBM网站对EasyMock和使用场景的一些介绍
EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助...本文将向您展示如何使用 EasyMock 进行单元测试,并对 EasyMock 的原理进行分析。 标签:easyMock
EasyMock主要是为测试提供模拟数据,比如你可以模拟HttpServletRequest。
easyMock2.2
还在为找不到jar文件烦心吗,不用了到我空间来有你想要的,持续更新。。。 easymock.jar,easymockclassextension.jar
easymock需要用到的包,没有它不行,easymock-3.1.jar
EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。 Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂...