3 回答
TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊
通過將此語句blah.testMe()包含在 中when(),它會(huì)調(diào)用真正的方法:
when(blah.testMe(Matchers.any())).thenReturn("intercepted");
為避免這種情況,您應(yīng)該使用doReturn(...).when(...).methodToInvoke()模式。
doReturn("intercepted").when(blah).testMe(Matchers.any()));
您注意到使用此語法:blah.testMe()語句未在任何地方指定。所以那不叫。
除了這個(gè)問題,我認(rèn)為你不需要任何間諜來測試這個(gè)方法。
間諜是一種非常特殊的模擬工具,僅當(dāng)您別無選擇時(shí)才使用它:您需要模擬被測對象,這是一種不好的做法,并且您無法重構(gòu)實(shí)際代碼。
但在這里你可以這樣做:
@Test
public void testTestMe(){
Blah blah = new Blah();
ArrayList<String> l = new ArrayList<String>();
l.add("oopsie");
assertEquals("hello oopsie",blah.testMe(l));
}
TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
您應(yīng)該重新考慮 usingspy等mock。當(dāng)您有外部系統(tǒng)、休息 web 服務(wù)、您不想在單元測試期間調(diào)用的數(shù)據(jù)庫時(shí),應(yīng)該使用這些設(shè)施。在像這樣的簡單場景中,只需創(chuàng)建一些測試輸入并檢查輸出。
@Test public void testTestMeString(){
//given
List<String> list = Arrays.asList("aaa");
//when
String result = blah.testMe(list);
//then
assertEquals(result, "hello aaa");
}
當(dāng)您有興趣時(shí),given, when, then請檢查 BDD。
TA貢獻(xiàn)1735條經(jīng)驗(yàn) 獲得超5個(gè)贊
您的 NullPointerException 在存根期間被拋出,而不是在測試期間。
這是因?yàn)?code>Matchers.any()實(shí)際上返回null,所以如果您在調(diào)用真正的方法時(shí)使用它,您將null作為參數(shù)傳遞。testMeString恰好有效,因?yàn)?code>null + s不會(huì)導(dǎo)致 NullPointerException("null"改為使用字符串)。
代替:
when(blah.testMe(any())).thenReturn("intercepted");你需要使用
doReturn("intercepted").when(blah).testMe(any());這被記錄為(雖然承認(rèn)不是非常清楚)作為間諜真實(shí)物體的重要陷阱!在 Mockito 文檔中。
添加回答
舉報(bào)
