У меня есть метод смоделированного объекта, который можно вызывать несколько раз (вспомним рекурсию). Метод определяется следующим образом:
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
и обеспечить реализацию пустой заглушки.