2014-01-17 40 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()