web-dev-qa-db-fra.com

Comment lever une exception uniquement lorsque la méthode simulée est appelée pour la première fois?

J'ai une méthode d'un objet moqué qui peut être appelé plusieurs fois (pensez à la récursivité). La méthode est définie comme ceci:

public void doCommit() { }

Afin de lui dire d'échouer, j'utilise cette convention:

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

Cependant, la méthode lève cette exception CHAQUE fois qu'elle est appelée. Comment puis-je faire en sorte qu'il ne lance, par exemple, que la première et la troisième fois qu'il est appelé? Ce qui signifie que, par exemple, la deuxième et la quatrième fois, il revient simplement sans lever d'exception. Veuillez noter que je ne suis pas l'auteur de doCommit (), ni le code source que je peux changer.

39
fnCzar

Je l'ai compris (avec quelques indices d'Igor). Voici comment vous pouvez bloquer les appels de méthode void consécutifs:

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

merci Igor!

61
fnCzar

Reading Stubbing Consecutive Calls doco , quelque chose comme ça pourrait le faire:

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

Si vous ne voulez pas réellement appeler la méthode sous-jacente, vous devez utiliser la méthode thenAnswer au lieu de thenCallRealMethod et fournir un stub vide mise en œuvre.

21
Igor Zevaka