[英]Using both mock and fake objects in junit testing
在單元測試代碼中同時使用模擬對象和偽對象是否合適?
例
when(computationHelper.someMethod()).thenReturn(stringGrid.writeCell(rowNum,colNum,value));
其中CalculationHelper是模擬對象,而stringGrid是我自己的實現和虛假對象。
是的,絕對可以,允許在同一測試中使用各種測試雙打,包括模擬,假冒和存根。 正如評論中提到的ndrone一樣 ,您可能希望選擇一個命名系統或約定,以幫助您識別哪個依賴項是模擬還是偽造的,尤其是使其更容易幫助診斷是否由於缺少模擬期望而導致測試失敗或由於實際的系統故障。
您也可以考慮使用實際的實現。 畢竟,隔離待測單元的決定可能會過分,因為人們希望您可以信任JRE的實現或Mockito的實現,而不應該試圖嘲笑或替換這些。 當它們是快速,確定性和經過良好測試的 ,並且它們足夠直接而不需要深度依賴關系圖本身時,我傾向於使用真實的實現。 (這需要一點判斷力;例如,我很想使用真實的EmailAddressParser,但可能不是真實的FullStackRpcServer。)
但是請注意,您可能需要將返回值提取到變量中。
Result result = stringGrid.writeCell(rowNum,colNum,value);
when(computationHelper.someMethod()).thenReturn(someMethodResult);
這有兩個原因:
對於Mockito的新手來說,您的原始語法可能看起來像writeCell
調用someMethod
都調用writeCell
,實際上除非您編寫自己的Answer,否則不會發生。 它提取到一個變量明確指出將的Mockito評估writeCell
只有一次,當你設置你when
發言。
盡管在使用偽造或真實實現時語法可以正常工作,但是如果stringGrid
是模擬的,則類似的代碼可能無法工作。 這是因為Mockito嚴重依賴於副作用和執行順序 ,因此在對方法進行存根時調用模擬可能會導致難以診斷的異常。 通常,更安全的是確保對when
或verify
的調用中的每個參數都是局部變量,常量或文字(可能在Mockito匹配器中,如適用); 提取此處可以更輕松地遵循該規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.