2014-01-17 36 views
0

我有一个测试,其中包括以下EasyMock的1个代码:模拟不再被调用时,从EasyMock的1转换到EasyMock的2/3

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

在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()