从EasyMock 1转换为EasyMock 2/3时,不再调用模拟

时间:2014-01-17 21:23:14

标签: java easymock

我的测试包含以下EasyMock 1代码:

persistenceManager.getCount(linkCodeAttributeCriteria);
persistenceManagerControl.setDefaultReturnValue(0);
persistenceManagerControl.replay();
//Run a method
persistenceManagerControl.verify();

既然我的公司最终升级了他们的EasyMock代码,我已将其更改为以下代码:

expect(persistenceManager.getCount(linkCodeAttributeCriteria)).andReturn(0);
replay(persistenceManager);
//Run a method
verify(persistenceManager);

但突然之间,测试失败了,说getCount预计会被调用一次,但被称为0次。这是我触及的唯一代码。为什么这个测试失败了?

1 个答案:

答案 0 :(得分:0)

在EasyMock 1中,MockControl有两种返回方法:setReturnValue()setDefaultReturnValue()。虽然类似,但它们有一个细微的区别:第一个期望方法被调用一次,第二个期望该方法被调用零次或多次。问题中的代码使用后者。

换句话说:

EasyMock 1                                  | EasyMock 2 and EasyMock 3
---------------------------------------------------------------------------------
setDefaultReturnValue(o)                    | andReturn(o).anyTimes()
setReturnValue(o, MockControl.ZERO_OR_MORE) | andReturn(o).anyTimes()
setReturnValue(o)                           | andReturn(o) or andReturn(o).once()
setReturnValue(o, 1)                        | andReturn(o) or andReturn(o).once()

事实上,您会注意到在EasyMock 1中,setDefaultReturnValue(o)相当于.setReturnValue(o, MockControl.ZERO_OR_MORE)。将等价替换为旧代码仍将使其运行,但是删除参数或将其更改为其他任何内容将导致测试失败,因为该方法没有被调用足够多次。

似乎EasyMock的开发人员决定通过只有一次回调(可能是一个很好的举动,考虑到这种混乱),andReturn(o)而不是两个不同的回复来简化事情,并且做出“零”时间或更长时间“并通过.anyTimes()进行显式通话。与EasyMock 1 setReturnValue()一样,一次仍然是EasyMock 2和3中的默认值,可以使用隐含的andReturn(o)或明确的andReturn(o).once()来调用。

如果您需要保持EasyMock 2/3格式的行为,请将setDefaultReturnValue(o)替换为andReturn(o).anyTimes()