2011-10-17 84 views
0

我有一個方法不返回值。它接受一個列表並修改這個列表的成員。顯然,這個清單本身是可變的,它的成員也是如此。如何嘲笑依賴更新可變對象的方法

EG:我想嘲笑這樣的:

void modifyRequests(List<MutableObject> requests); 

回答

4

好,各種嘲諷框架提供這樣做(使用時調用的方法的參數執行自定義操作)的方式 - 但我會強烈考慮使用嘲笑而不是。除非你真的想驗證你的課堂測試和它的合作者之間的協議,你應該考慮寫一個假冒而不是模擬。然後,無論您喜歡什麼,都可以讓假冒行爲 - 通常(IME)您最終得到更簡單的測試代碼。

這並不總是合適的,嘲笑當然有它的位置 - 但隨着時間的推移,我發現一個寫得好的假冒可以在黃金中佔據重要位置,特別是如果它是許多類別使用的依賴。

2

隨着Mockito(我想其他嘲諷框架可以做到這一點爲好):

doAnswer(new Answer() { 
    public Object answer(InvocationOnMock invocation) { 
     Object[] args = invocation.getArguments(); 
     List<MutableObject> arg = args[0]; 
     MutableObject obj = arg.get(0); 
     //... 
     return null; 
    }}) 
.when(mock).modifyRequests(); 

醜,你不覺得嗎?我強烈建議提取這個匿名的內部類並將其命名爲描述性的。我建議更強大的重構你的代碼,並簡單地返回List<MutableObject> requests(或者可能返回修改後的副本 - 要修改的傳遞對象有點笨拙)。

+0

用於重構代碼的+1;這是你的測試,讓你遠離有疑問的設計 –

+0

我更喜歡回報太....我選擇了可​​變概念,因爲其他方法也會修改它。 – Zombies

2

如果您正在嘲笑該方法,爲什麼使用該方法的代碼需要知道對modifyRequests()的調用是否改變了任何內容?

換句話說,您應該能夠將此方法作爲無操作模擬,並且調用它的代碼仍應該具有相同的功能。

否則,調用此方法的代碼和方法本身耦合得太緊密。