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

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

public void doCommit() { }

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

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

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

38
задан fnCzar 16 August 2010 в 22:56
поделиться

2 ответа

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

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

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

60
ответ дан 27 November 2019 в 03:26
поделиться

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

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

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

21
ответ дан 27 November 2019 в 03:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: