163 votes

Mockito Comment simuler et affirmer une exception levée ?

J'utilise mockito dans un test junit. Comment faire pour qu'une exception se produise et ensuite affirmer qu'elle s'est produite (pseudo-code générique) ?

236voto

NilsH Points 7340

Pour répondre d'abord à votre deuxième question. Si vous utilisez JUnit 4, vous pouvez annoter votre test avec

@Test(expected=MyException.class)

pour affirmer qu'une exception s'est produite. Et pour "simuler" une exception avec mockito, utilisez

when(myMock.doSomething()).thenThrow(new MyException());

82voto

MariuszS Points 7842

BDD Solution de style (mise à jour vers Java 8)

Mockito n'est pas la meilleure solution pour gérer les exceptions. Mockito avec Catch-Exception

Mockito + Catch-Exception + AssertJ

given(otherServiceMock.bar()).willThrow(new MyException());

when(() -> myService.foo());

then(caughtException()).isInstanceOf(MyException.class);

Exemple de code

Dépendances

35voto

Daniel Treiber Points 576

Si vous voulez également tester le message d'exception, vous pouvez utiliser ExpectedException de JUnit avec Mockito :

@Rule
public ExpectedException expectedException = ExpectedException.none();

@Test
public void testExceptionMessage() throws Exception {
    expectedException.expect(AnyException.class);
    expectedException.expectMessage("The expected message");

    given(foo.bar()).willThrow(new AnyException("The expected message"));
}

34voto

Selwyn Points 2088

Réponse mise à jour pour le 19/06/2015 (si vous utilisez java 8).

Utilisez simplement assertj

Utilisation de assertj-core-3.0.0 + Java 8 Lambdas

@Test
public void shouldThrowIllegalArgumentExceptionWhenPassingBadArg() {
assertThatThrownBy(() -> myService.sumTingWong("badArg"))
                                  .isInstanceOf(IllegalArgumentException.class);
}

Référence : http://blog.codeleak.pl/2015/04/junit-testing-exceptions-with-java-8.html

19voto

Prashant Kumar Points 191

Si vous utilisez JUnit 4, et Mockito 1.10.x Annotez votre méthode de test avec :

@Test(expected = AnyException.class)

et de lancer votre utilisation de l'exception souhaitée :

Mockito.doThrow(new AnyException()).when(obj).callAnyMethod();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X