@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