2010-11-18 90 views
11

如何存儲一個方法,以便在給定值時我不期待它返回一個默認值?在Mockito中存儲默認值

例如:

Map<String, String> map = mock(Map.class); 
when(map.get("abcd")).thenReturn("defg"); 
when(map.get("defg")).thenReturn("ghij"); 
when(map.get(anyString())).thenReturn("I don't know that string"); 

2部分:同上,但會拋出異常:

Map<String, String> map = mock(Map.class); 
when(map.get("abcd")).thenReturn("defg"); 
when(map.get("defg")).thenReturn("ghij"); 
when(map.get(anyString())).thenThrow(new IllegalArgumentException("I don't know that string")); 

在上面的例子中,最後存根優先所以地圖總是會返回默認值。

+0

問題是? – Bozho 2010-11-18 15:22:17

回答

21

我已經找到了最好的解決辦法是扭轉存根的順序:

Map<String, String> map = mock(Map.class); 
when(map.get(anyString())).thenReturn("I don't know that string"); 
when(map.get("abcd")).thenReturn("defg"); 
when(map.get("defg")).thenReturn("ghij"); 

當默認的是拋出一個異常,你可以只使用doThrow和doReturn

doThrow(new RuntimeException()).when(map).get(anyString()); 
doReturn("defg").when(map).get("abcd"); 
doReturn("ghij").when(map).get("defg"); 

http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html#doReturn%28java.lang.Object%29

+1

感謝您的詳細解答,包括'doReturn()'。 (除了一致性,在這種情況下'doThrow()'是不必要的。) – David 2015-09-01 17:23:05

2
when(map.get(anyString())).thenAnswer(new Answer<String>() { 
    public String answer(Invocation invocation) { 
     String arg = (String) invocation.getArguments()[0]; 
     if (args.equals("abcd") 
      return "defg"; 
     // etc. 
     else 
      return "default"; 
      // or throw new Exception() 
    } 
}); 

這是一種迂迴的方式來做到這一點。但它應該工作。

2

您可以使用:

Map<String, String> map = mock(Map.class, new Returns("I don't know that string")); 
when(map.get("abcd")).thenReturn("defg"); 
when(map.get("defg")).thenReturn("ghij");