2010-08-16 8 views
30

Ho un metodo di un oggetto deriso che può essere chiamato più volte (si pensi alla ricorsione). Il metodo è definito in questo modo:Come lanciare un'eccezione solo quando viene chiamato per la prima volta il metodo mocked?

public void doCommit() { } 

Per raccontarla a fallire io uso questa convenzione:

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

questo, però, rende il metodo lanciare questa eccezione ogni volta che viene chiamato. Come posso fare in modo che solo, ad esempio, lo lanci la prima e la terza volta che viene chiamato? Ciò significa che, ad esempio, la seconda e la quarta volta torna indietro senza generare un'eccezione. Si prega di notare che io non sono l'autore di doCommit(), né ho il codice sorgente che posso modificare.

risposta

49

L'ho capito (con alcuni suggerimenti di Igor). Ecco come si stub chiamate di metodo vuoto consecutivi:

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

grazie Igor!

+1

Grande, felice di averti indicato nella giusta direzione. –

+1

con 'BDDMockito' sarebbe' willThrow (new RuntimeException()). WillNothing(). WillThrow (...). WillNothing(). Given (mMockedObject) .doCommit(); ' – ArtB

17

lettura Stubbing Consecutive Calls doco, qualcosa di simile potrebbe farlo:

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

Se non si desidera chiamare in realtà il metodo sottostante quindi si dovrebbe utilizzare thenAnswer invece di thenCallRealMethod metodo e fornire un imlementation stub vuoto.

+1

Non sono sicuro che questo funzionerà (ma potresti essere coinvolto in qualcosa). Quando scrivo questo: quando (mMockedUpdatingBatch.updateBatch()). ThenThrow (new RuntimeException()); Viene visualizzato questo errore di compilazione: Il metodo quando (T) nel tipo Mockito non è applicabile per gli argomenti (void). Penso che quando() si aspetta che il metodo deriso non sia nullo. – fnCzar

+2

Forse è necessario riscriverlo in primo piano se è possibile utilizzare 'doThrow(). DoCallRealMethod(). When (mMockedObject) .doCommit();'? –

Problemi correlati