Monday, June 24, 2019

Test unitaire des exceptions avec JUnit

Pour tester en détail une exception dans un test Junit, j'utilisais jusqu'ici expected qui teste uniquement qu'une exception du type est envoyé.

@Test(expected = 'MyException.class')
Pour Junit 4

L'utilisation de @Rule et ExpectedException permet de faire des tests plus poussés.
@Rule
public ExpectedException expectedEx = ExpectedException.none();

@Test
public void shouldThrowRuntimeExceptionWhenEmployeeIDisNull() throws Exception {
    expectedEx.expect(RuntimeException.class);
    expectedEx.expectMessage("Employee ID is null");
    // do something that should throw the exception...
}
Ou encore tester directement l'exception remontée.

@Test
public void shouldThrowMyExceptionWhenMyMockedServiceThrow() throws Exception {
    MyException myException = Mockito.mock(MyException.class);
    Mockito.when(myMockedService.myMockMethod()).thenThrow(myException);

    expectedEx.expect(Is.is(myException));
    myInjectedMockService.myInjectedMockMethod();
}

Cependant, dans les cas ou nous souhaitons tester qu'une méthode n'est pas appelée (à cause de l'exception) via verify, il faudra revenir à un try / catch classique.

Pour Junit 5

Pour activer JUnit 5 sur votre projet spring boot, suivez ce lien.

Avec JUnit 5, le test des exceptions devient simple et complet avec assertThrows

Voici un exemple:

@Test
public void shouldThrowMyExceptionWhenMyMockedServiceThrow() throws Exception {
    MyException myException = Mockito.mock(MyException.class);
    Mockito.when(myMockedService.myMockMethod()).thenThrow(myException);

    MyException thrownException = assertThrows(MyException.class, () -> myInjectedMockService.myInjectedMockMethod());

    assertEquals(myException, thrownException);
    verify(myOtherService, times(0)).otherMethod();
}

On a le meilleur des deux mondes. On récupère l'exception que l'on peut tester et on a toujours la main après pour faire d'autres assert / verify.





2 comments:

  1. This comment has been removed by the author.

    ReplyDelete
  2. Sinon apparemment Junit 5 a assertThrows qui est mieux et qui sera éventuellement dans Junit 4.13 aussi

    ReplyDelete