Stubbing по умолчанию в 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"));
В приведенных выше примерах последний заглушка имеет приоритет, поэтому карта всегда будет возвращать значение по умолчанию.
Ответы
Ответ 1
Лучшее решение, которое я нашел, - это изменить порядок заглушек:
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
Ответ 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()
}
});
Это своего рода обходной способ сделать это. Но он должен работать.
Ответ 3
Вы можете использовать:
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");