我的测试包含以下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次。这是我触及的唯一代码。为什么这个测试失败了?
答案 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()
。