Как создать исключение только при первом вызове смоделированного метода? - PullRequest
37 голосов
/ 17 августа 2010

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

public void doCommit() { }

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

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

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

Ответы [ 2 ]

59 голосов
/ 17 августа 2010

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

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

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

20 голосов
/ 17 августа 2010

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

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

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

...