Подтвердить что ты не робот

Как только бросать исключение, когда вызывается метод издевательства?

У меня есть метод издевающегося объекта, который можно вызвать несколько раз (подумайте о рекурсии). Метод определяется следующим образом:

public void doCommit() { }

Чтобы сообщить об ошибке, я использую это соглашение:

doThrow(new RuntimeException()).when(mMockedObject).doCommit();

Это, тем не менее, заставляет метод выбрасывать это исключение КАЖДОЕ время его вызова. Как я могу сделать это так, чтобы он, например, выдавал его в первый и третий раз? Это означает, что, например, второе и четвертое время, которое он просто возвращает, не выбрасывая исключение. Обратите внимание, что я не являюсь автором doCommit(), и у меня нет исходного кода, который я могу изменить.

4b9b3361

Ответ 1

Я понял это (с некоторыми намеками от Игоря). Вот как вы завершаете последовательные вызовы метода void:

doThrow(new RuntimeException()).doNothing().doThrow(...).doNothing().when(mMockedObject).doCommit();

спасибо Игорю!

Ответ 2

Чтение Выполнение последовательных вызовов doco, что-то вроде этого может сделать:

when(mMockedObject.doCommit())
  .thenThrow(new RuntimeException())
  .thenCallRealMethod() 
  .thenThrow(new RuntimeException())
  .thenCallRealMethod();

Если вы не хотите на самом деле вызывать базовый метод, вы должны использовать thenAnswer вместо thenCallRealMethod и обеспечить пустую пробивку заглушки.