Ответ 1
Я понял это (с некоторыми намеками от Игоря). Вот как вы завершаете последовательные вызовы метода void:
doThrow(new RuntimeException()).doNothing().doThrow(...).doNothing().when(mMockedObject).doCommit();
спасибо Игорю!
У меня есть метод издевающегося объекта, который можно вызвать несколько раз (подумайте о рекурсии). Метод определяется следующим образом:
public void doCommit() { }
Чтобы сообщить об ошибке, я использую это соглашение:
doThrow(new RuntimeException()).when(mMockedObject).doCommit();
Это, тем не менее, заставляет метод выбрасывать это исключение КАЖДОЕ время его вызова. Как я могу сделать это так, чтобы он, например, выдавал его в первый и третий раз? Это означает, что, например, второе и четвертое время, которое он просто возвращает, не выбрасывая исключение. Обратите внимание, что я не являюсь автором doCommit(), и у меня нет исходного кода, который я могу изменить.
Я понял это (с некоторыми намеками от Игоря). Вот как вы завершаете последовательные вызовы метода void:
doThrow(new RuntimeException()).doNothing().doThrow(...).doNothing().when(mMockedObject).doCommit();
спасибо Игорю!
Чтение Выполнение последовательных вызовов doco, что-то вроде этого может сделать:
when(mMockedObject.doCommit())
.thenThrow(new RuntimeException())
.thenCallRealMethod()
.thenThrow(new RuntimeException())
.thenCallRealMethod();
Если вы не хотите на самом деле вызывать базовый метод, вы должны использовать thenAnswer
вместо thenCallRealMethod
и обеспечить пустую пробивку заглушки.