2010-08-16 4 views
30

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

public void doCommit() { } 

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

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

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

ответ

49

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

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

спасибо Igor!

+1

Отлично, рад, что я указал тебе в правильном направлении. –

+1

с 'BDDMockito' это будет' willThrow (новое RuntimeException()). WillNothing(). WillThrow (...). WillNothing(). Given (mMockedObject) .doCommit(); ' – ArtB

17

Чтение Stubbing Consecutive Calls doco, что-то подобное может сделать это:

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

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

+1

Я не уверен, что это сработает (но вы можете что-то сказать). Когда я пишу это: когда (mMockedUpdatingBatch.updateBatch()). ThenThrow (новое RuntimeException()); Я получаю эту ошибку компиляции: Метод, когда (T) в типе Mockito не применим для аргументов (void). Я думаю, что когда() ожидает, что издевавшийся метод будет непустым. – fnCzar

+2

Возможно, его нужно переписать обратно на передний план, если это возможно с помощью 'doThrow(). DoCallRealMethod(). When (mMockedObject) .doCommit();'? –

 Смежные вопросы

  • Нет связанных вопросов^_^