Easymock 简介

Mock(模拟)

Mock 方法是单元测试中常见的一种技术,它的主要作用是模拟一些在应用中不容易构造或者比较复杂的对象,从而把测试与测试边界以外的对象隔离开。同时也可以当调用别人的模块,而该模块又没有实现时(只提供接口),我们可以在独立的环境中测试自己的模块逻辑。

EasyMock

EasyMock 是一套用于通过简单的方法对于给定的接口生成 Mock 对象的类库。它提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定的值或抛出指定异常。通过 EasyMock,我们可以方便的构造 Mock 对象从而使单元测试顺利进行。
使用前的准备,下载所需的jar包:easymock-3.4.jar(或以上版本)

步骤

•使用 EasyMock 生成 Mock 对象;
•设定 Mock 对象的预期行为和输出;
•将 Mock 对象切换到 Replay 状态;
•调用 Mock 对象方法进行单元测试;
•对 Mock 对象的行为进行验证。

使用 EasyMock 生成 Mock 对象

根据指定的接口或类,EasyMock 能够动态的创建 Mock 对象(EasyMock 默认只支持为接口生成 Mock 对象,如果需要为类生成 Mock 对象,在 EasyMock 的主页上有扩展包可以实现此功能 )
marketMock = EasyMock.createMock(StockMarket.class);
其中 createMock 是 org.easymock.EasyMock 类所提供的静态方法
如果需要在相对复杂的测试用例中使用多个 Mock 对象,EasyMock 提供了另外一种生成和管理 Mock 对象的机制:
EasyMock 类的 createControl 方法能创建一个接口 IMocksControl 的对象,该对象能创建并管理多个 Mock 对象。如果需要在测试中使用多个 Mock 对象,推荐使用这一机制,因为它在多个 Mock 对象的管理上提供了相对便捷的方法。
MOCK
如果要模拟的是一个具体类而非接口,那么您需要下载扩展包 EasyMock Class Extension 。
在对具体类进行模拟时,您只要用org.easymock.classextension.EasyMock 类中的静态方法代org.easymock.EasyMock 类中的静态方法即可。

设定 Mock 对象的预期行为和输出

在一个完整的测试过程中,一个 Mock 对象将会经历两个状态:Record 状态和 Replay 状态。Mock 对象一经创建,它的状态就被置为 Record。在 Record 状态,用户可以设定 Mock 对象的预期行为和输出,这些对象行为被录制下来,保存在 Mock 对象中。
EasyMock.expect(marketMock.getPrice(“EBAY”)).andReturn(42.00);

设定预期返回值

Mock 对象的行为可以简单的理解为 Mock 对象方法的调用和方法调用所产生的输出。
Mock 对象方法的调用可能产生两种类型的
(1)产生返回值;.andReturn(T value)
(2)抛出异常; . andThrow(Throwable throwable);
通过以上的函数,可以对 Mock 对象特定行为的预期输出进行设定。

设定预期方法调用次数

除了对预期输出进行设定,还允许用户对方法的调用次数作出限制,常用的一种是 .times(int count)方法。
times(int minTimes, int maxTimes):该方法最少被调用 minTimes 次,最多被调用 maxTimes 次。
atLeastOnce():该方法至少被调用一次。
anyTimes():该方法可以被调用任意次。

将Mock 对象切换到Replay 状态

在生成 Mock 对象和设定 Mock 对象行为两个阶段,Mock 对象的状态都是 Record 。在这个阶段,Mock 对象会记录用户对预期行为和输出的设定。
在使用 Mock 对象进行实际的测试前,需要将 Mock 对象的状态切换为 Replay。在 Replay 状态,Mock 对象能够根据设定对特定的方法调用作出预期的响应。
将 Mock 对象切换成 Replay 状态有两种方式,您需要根据 Mock 对象的生成方式进行选择。
1. 静态方法 createMock 生成的mock对象, 使用的replay 方法切换为 Replay 状态:replay(marketMock);
2. 通过 IMocksControl 接口提供的 createMock 方法生成的,通过 IMocksControl 接口对它所创建的所有 Mock 对象进行切换:control.replay()。

猜你喜欢

转载自blog.csdn.net/shensiback/article/details/80727416