@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.
This comment has been removed by the author.
ReplyDeleteSinon apparemment Junit 5 a assertThrows qui est mieux et qui sera éventuellement dans Junit 4.13 aussi
ReplyDelete