3 回答

TA貢獻1895條經驗 獲得超7個贊
通過將此語句blah.testMe()包含在 中when(),它會調用真正的方法:
when(blah.testMe(Matchers.any())).thenReturn("intercepted");
為避免這種情況,您應該使用doReturn(...).when(...).methodToInvoke()模式。
doReturn("intercepted").when(blah).testMe(Matchers.any()));
您注意到使用此語法:blah.testMe()語句未在任何地方指定。所以那不叫。
除了這個問題,我認為你不需要任何間諜來測試這個方法。
間諜是一種非常特殊的模擬工具,僅當您別無選擇時才使用它:您需要模擬被測對象,這是一種不好的做法,并且您無法重構實際代碼。
但在這里你可以這樣做:
@Test
public void testTestMe(){
Blah blah = new Blah();
ArrayList<String> l = new ArrayList<String>();
l.add("oopsie");
assertEquals("hello oopsie",blah.testMe(l));
}

TA貢獻1851條經驗 獲得超3個贊
您應該重新考慮 usingspy等mock。當您有外部系統、休息 web 服務、您不想在單元測試期間調用的數據庫時,應該使用這些設施。在像這樣的簡單場景中,只需創建一些測試輸入并檢查輸出。
@Test public void testTestMeString(){
//given
List<String> list = Arrays.asList("aaa");
//when
String result = blah.testMe(list);
//then
assertEquals(result, "hello aaa");
}
當您有興趣時,given, when, then請檢查 BDD。

TA貢獻1735條經驗 獲得超5個贊
您的 NullPointerException 在存根期間被拋出,而不是在測試期間。
這是因為Matchers.any()
實際上返回null
,所以如果您在調用真正的方法時使用它,您將null
作為參數傳遞。testMeString
恰好有效,因為null + s
不會導致 NullPointerException("null"
改為使用字符串)。
代替:
when(blah.testMe(any())).thenReturn("intercepted");
你需要使用
doReturn("intercepted").when(blah).testMe(any());
這被記錄為(雖然承認不是非常清楚)作為間諜真實物體的重要陷阱!在 Mockito 文檔中。
添加回答
舉報