`

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 使用案例(含lib)"中,我们将会深入探讨如何利用EasyMock进行Java单元测试,并通过具体的例子——EasyMockDemo来讲解其用法。 首先,EasyMock的基本理念是让你能够定义模拟对象的行为,比如它应该...

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

    EasyMock是Java编程中的一款强大的模拟框架,它允许开发者在单元测试中创建和控制...通过阅读《EasyMock使用简明手册》和解压后的easymock2.4.zip文件,开发者可以深入理解并掌握如何有效地使用EasyMock进行单元测试。

    EasyMock介绍和使用

    【EasyMock使用方法】 1. **创建模拟对象**:首先,需要通过`EasyMock.createMock()`方法创建模拟对象,指定需要模拟的接口。 2. **预设行为**:使用`expect()`方法设定模拟对象的方法调用应如何响应,例如返回...

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

    本文将深入探讨EasyMock的使用方法及其工作原理,帮助开发者更好地理解和运用这一工具。 ### EasyMock的基本概念 - **模拟对象(Mock Object)**:在测试中,模拟对象是替代真实对象的类,它会根据预定义的行为来...

    easymock资料和源代码实例

    **Easymock使用示例** 1. **导入库**:首先,在项目中引入Easymock库,通常通过Maven或Gradle等构建工具完成。 2. **创建模拟对象**:使用`EasyMock.createMock()`方法创建模拟对象,如`MyInterface mockObject = ...

    Easymock学习笔记

    10. **EasyMock使用方法**:在编写测试用例时,典型的做法是首先设定Mock对象的期望,然后调用待测试的方法,最后验证Mock对象的行为是否符合预期,如 `expect(mockEmployeeRepository.findByFirstNameAndLastName(...

    easymock教程

    - **MockControl**:早期版本的Easymock使用MockControl来创建Mock对象。虽然现在更推荐使用Easymock的新API,但了解MockControl的基本用法仍然有助于理解Mock对象的工作原理。 以上内容是对Easymock教程的深入解析...

    EasyMock用到的objenesis

    EasyMock 使用Objenesis 来快速实例化模拟对象,特别是在那些没有默认构造函数或者构造函数有特定初始化需求的类中。 Objenesis 的核心功能在于它的`Instantiator`接口,提供了多种策略来实例化对象。例如,`...

    easymock-request.getParamsNames

    在这些测试方法中,你会看到上面描述的Easymock使用示例。 另一方面,`HttpServletRequest的属性_百度知道.mht` 文件可能是一个包含了关于 `HttpServletRequest` 接口更详细信息的资料,例如它提供的其他方法和属性...

    easyMock.zip

    这个“easyMock.zip”文件包含了一个关于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时,我们通常会遵循以下步骤: 1. **创建模拟对象**:首先,你需要通过`EasyMock.createMock()`方法创建一个模拟对象。例如,如果你有一个名为`MyInterface`的接口,你可以这样创建它的模拟对象...

    EasyMockTest

    三、EasyMock使用步骤 1. 创建模拟对象:使用`EasyMock.createMock()`方法创建一个模拟对象。 2. 预定义行为:使用`expect()`方法指定模拟对象的方法调用预期,包括返回值、参数匹配等。 3. 初始化模拟对象:使用`...

Global site tag (gtag.js) - Google Analytics