如何对一个方法进行存根,以便在给定一个我不期望的值时,它会返回一个默认值?
例如:
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 :(得分:25)
我找到的最佳解决方案是颠倒存根的顺序:
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");
https://static.javadoc.io/org.mockito/mockito-core/2.18.3/org/mockito/Mockito.html#12
答案 1 :(得分: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 :(得分: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");