2010-11-18 83 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");