我有一個方法不返回值。它接受一個列表並修改這個列表的成員。顯然,這個清單本身是可變的,它的成員也是如此。如何嘲笑依賴更新可變對象的方法
EG:我想嘲笑這樣的:
void modifyRequests(List<MutableObject> requests);
我有一個方法不返回值。它接受一個列表並修改這個列表的成員。顯然,這個清單本身是可變的,它的成員也是如此。如何嘲笑依賴更新可變對象的方法
EG:我想嘲笑這樣的:
void modifyRequests(List<MutableObject> requests);
好,各種嘲諷框架做提供這樣做(使用時調用的方法的參數執行自定義操作)的方式 - 但我會強烈考慮使用嘲笑而不是。除非你真的想驗證你的課堂測試和它的合作者之間的協議,你應該考慮寫一個假冒而不是模擬。然後,無論您喜歡什麼,都可以讓假冒行爲 - 通常(IME)您最終得到更簡單的測試代碼。
這並不總是合適的,嘲笑當然有它的位置 - 但隨着時間的推移,我發現一個寫得好的假冒可以在黃金中佔據重要位置,特別是如果它是許多類別使用的依賴。
隨着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
(或者可能返回修改後的副本 - 要修改的傳遞對象有點笨拙)。
如果您正在嘲笑該方法,爲什麼使用該方法的代碼需要知道對modifyRequests()
的調用是否改變了任何內容?
換句話說,您應該能夠將此方法作爲無操作模擬,並且調用它的代碼仍應該具有相同的功能。
否則,調用此方法的代碼和方法本身耦合得太緊密。
用於重構代碼的+1;這是你的測試,讓你遠離有疑問的設計 –
我更喜歡回報太....我選擇了可變概念,因爲其他方法也會修改它。 – Zombies