背景:
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:静态导入 EasyMockimport 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 这样的。
posted on 2007-01-18 23:03
哈哈的日子 阅读(3062)
评论(5) 编辑 收藏 所属分类:
Java