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");