EasyMock 是一套用于通过简单的方法对于给定的接口生成 Mock 对象的类库。它提供对接口的模拟,能够通过录制、回放、检查三步来完成大体的测试过程,可以验证方法的调用种类、次数、顺序,可以令 Mock 对象返回指定的值或抛出指定异常。通过 EasyMock,我们可以方便的构造 Mock 对象从而使单元测试顺利进行。
根据指定的接口或类,EasyMock 能够动态的创建 Mock 对象(EasyMock 默认只支持为接口生成 Mock 对象,如果需要为类生成 Mock 对象,在 EasyMock 的主页上有扩展包可以实现此功能。
在一个完整的测试过程中,一个 Mock 对象将会经历两个状态:Record 状态和 Replay 状态。Mock 对象一经创建,它的状态就被置为 Record。在 Record 状态,用户可以设定 Mock 对象的预期行为和输出,这些对象行为被录制下来,保存在 Mock 对象中。
添加 Mock 对象行为的过程通常可以分为以下3步:
- 对 Mock 对象的特定方法作出调用;
- 通过
org.easymock.EasyMock
提供的静态方法expectLastCall
获取上一次方法调用所对应的 IExpectationSetters 实例; - 通过
IExpectationSetters
实例设定 Mock 对象的预期输出。
参数方法
anyObject
方法表示任意输入值都与预期值相匹配。除了 anyObject
以外,EasyMock还提供了多个预先定义的参数匹配器,其中比较常用的一些有:
aryEq(X value)
:通过Arrays.equals()
进行匹配,适用于数组对象;isNull()
:当输入值为Null时匹配;notNull()
:当输入值不为Null时匹配;same(X value)
:当输入值和预期值是同一个对象时匹配;lt(X value), leq(X value), geq(X value), gt(X value)
:当输入值小于、小等于、大等于、大于预期值时匹配,适用于数值类型;startsWith(String prefix), contains(String substring), endsWith(String suffix)
:当输入值以预期值开头、包含预期值、以预期值结尾时匹配,适用于String类型;matches(String regex)
:当输入值与正则表达式匹配时匹配,适用于String类型。
参数匹配器,需要实现 org.easymock.IArgumentMatcher
接口,其中,matches(Object actual)
方法应当实现输入值和预期值的匹配逻辑,而在 appendTo(StringBuffer buffer)
方法中,你可以添加当匹配失败时需要显示的信息。
在实现了 IArgumentMatcher
接口之后,我们需要写一个静态方法将它包装一下。这个静态方法的实现需要将 SQLEquals 的一个对象通过reportMatcher
方法报告给EasyMock: