2010-08-16 7 views
30

Ich habe eine Methode eines verspotteten Objekts, das mehrfach aufgerufen werden kann (Think Recursion). Das Verfahren ist wie folgt definiert:Wie wird nur die Ausnahme ausgelöst, wenn die Mocked-Methode zum ersten Mal aufgerufen wird?

public void doCommit() { } 

Um es zu sagen, ich diese Konvention verwenden fehlschlagen:

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

Das aber macht die Methode diese Ausnahme jedes Mal werfen sie aufgerufen wird. Wie kann ich es so machen, dass es nur zum Beispiel das erste und dritte Mal, dass es aufgerufen wird, wirft? Das bedeutet, dass zum Beispiel beim zweiten und vierten Mal es einfach zurückkehrt, ohne eine Ausnahme zu werfen. Bitte beachten Sie, dass ich weder der Autor von doCommit() bin, noch Quellcode habe, den ich ändern kann.

Antwort

49

ich es herausgefunden (mit einigen Hinweisen von Igor). So stubsen Sie aufeinanderfolgende ungültige Methodenaufrufe:

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

danke Igor!

+1

Großartig, froh, dass ich dich in die richtige Richtung wies. –

+1

mit 'BDDMockito' wäre es' willThrow (neue Runtime()) willNothing() willThrow (...) willNothing() gegeben (mMockedObject) .doCommit();.... ' – ArtB

17

Lesen Stubbing Consecutive Calls doco, so etwas wie dieses könnte es tun:

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

Wenn Sie tatsächlich nicht die zugrunde liegende Methode aufrufen wollen, dann sollten Sie thenAnswer statt thenCallRealMethod Methode verwenden und einen leeren Stummel imlementation bieten.

+1

Ich bin mir nicht sicher, dass das funktioniert (aber Sie könnten auf etwas sein). Wenn ich dies schreibe. wenn (mMockedUpdatingBatch.updateBatch()) thenThrow (neu Runtime()); Ich erhalte diesen Compiler-Fehler: Verfahren, wenn (T) in der Art Mockito nicht anwendbar für die Argumente (void). Ich denke, wenn() erwartet die verspottete Methode nicht void. – fnCzar

+2

Vielleicht muss es neu geschrieben werden, wenn das mit 'doThrow(). DoCallRealMethod() möglich ist. When (mMockedObject) .doCommit(); '? –

Verwandte Themen