`

EasyMock 使用

JDK 
阅读更多

背景:
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 使用案例(含lib)

    使用EasyMock做java单元测试的例子,包含所需要的jar包

    EasyMock 使用方法与原理剖析

    EasyMock单元测试的扩展; EasyMock简介(抽象类接口做测试); EasyMock来进行测试; EasyMock如何打桩;...EasyMock使用技巧; EasyMock使用简明手册; EasyMock使用说明; EasyMock使用手记; 用Mock object进行隔离测试;

    easymock2.4+EasyMock使用简明手册.pdf

    easymock2 EasyMock使用简明手册

    EasyMock 使用方法与原理剖析.rar

    EasyMock 使用方EEasyMock 使用方法与原理剖析.rar

    easymock 的使用方法简介

    easymock 的使用方法简介easymock 的使用方法简介

    EasyMock 3.1相关jar(所有)

    还在为EasyMock使用时出异常而烦恼? 本压缩包包含除了Junit4之外easyMock3.1所用到的所有相关jar包,junit4可自己导入eclipse自带的即可 本压缩包包括: asm.jar cglib.jar objenesis.jar等 其中asm与cglib已兼容,放心...

    EasyMock 教程

    EasyMock使用教程,快来看看你还有什么秘密没有发现吧!

    easymock的使用,含demo

    本文将对 EasyMock 的功能和原理进行介绍,并通过示例来说明如何使用 EasyMock 进行单元测试。 Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与...

    easyMock

    easyMock

    Easy Mock 详解

    EasyMock单元测试的扩展; EasyMock简介(抽象类接口做测试); EasyMock来进行测试; EasyMock如何打桩;...EasyMock使用技巧; EasyMock使用简明手册; EasyMock使用说明; EasyMock使用手记; 用Mock object进行隔离测试;

    EasyMock介绍和使用

    IBM网站对EasyMock和使用场景的一些介绍

    模拟测试辅助工具easyMock.zip

    EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助...本文将向您展示如何使用 EasyMock 进行单元测试,并对 EasyMock 的原理进行分析。 标签:easyMock

    easymock-3.2.jar

    EasyMock主要是为测试提供模拟数据,比如你可以模拟HttpServletRequest。

    easyMock2.2.doc

    easyMock2.2

    easymock.jar,easymockclassextension.jar

    还在为找不到jar文件烦心吗,不用了到我空间来有你想要的,持续更新。。。 easymock.jar,easymockclassextension.jar

    easymock-3.1.jar

    easymock需要用到的包,没有它不行,easymock-3.1.jar

    easymock-4.2.jar

    EasyMock 是一套通过简单的方法对于指定的接口或类生成 Mock 对象的类库,它能利用对接口或类的模拟来辅助单元测试。 Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂...

Global site tag (gtag.js) - Google Analytics