Affirmer qu'une exception est levée dans JUnit 4 et 5

1. Introduction

Dans ce rapide didacticiel, nous allons voir comment tester si une exception a été levée à l'aide de la bibliothèque JUnit.

Nous nous assurerons bien sûr de couvrir à la fois les versions JUnit 4 et JUnit 5.

2. JUnit 5

L'API d'assertions Jupiter JUnit 5 introduit la méthode assertThrows pour affirmer des exceptions.

Cela prend le type de l'exception attendue et une interface fonctionnelle exécutable où nous pouvons passer le code sous test via une expression lambda:

@Test public void whenExceptionThrown_thenAssertionSucceeds() { Exception exception = assertThrows(NumberFormatException.class, () -> { Integer.parseInt("1a"); }); String expectedMessage = "For input string"; String actualMessage = exception.getMessage(); assertTrue(actualMessage.contains(expectedMessage)); }

Si l'exception attendue est levée , assertThrows renvoie l'exception, ce qui nous permet également de nous affirmer sur le message.

En outre, il est important de noter que cette assertion est satisfaite lorsque le code inclus lève une exception de type NullPointerException ou l'un de ses types dérivés.

Cela signifie que si nous transmettons Exception comme type d'exception attendu, toute exception levée fera réussir l'assertion car Exception est le super-type de toutes les exceptions.

Si nous modifions le test ci-dessus pour attendre une RuntimeException , cela passera également:

@Test public void whenDerivedExceptionThrown_thenAssertionSucceds() { Exception exception = assertThrows(RuntimeException.class, () -> { Integer.parseInt("1a"); }); String expectedMessage = "For input string"; String actualMessage = exception.getMessage(); assertTrue(actualMessage.contains(expectedMessage)); }

La méthode assertThrows () permet un contrôle plus fin pour la logique d'assertion d'exception car nous pouvons utiliserautour de parties spécifiques du code.

3. JUnit 4

Lors de l'utilisation de JUnit 4, nous pouvons simplement utiliser l' attribut attendu de l' annotation @Test pour déclarer que nous nous attendons à ce qu'une exception soit levée n'importe où dans la méthode de test annotée.

En conséquence, lorsque le test est exécuté, il échouera si l'exception spécifiée n'est pas levée et passera si elle est levée:

@Test(expected = NullPointerException.class) public void whenExceptionThrown_thenExpectationSatisfied() { String test = null; test.length(); }

Dans cet exemple, nous avons déclaré que nous nous attendons à ce que notre code de test aboutisse à une NullPointerException .

Cela suffit si nous voulons uniquement affirmer qu'une exception est levée.

Lorsque nous devons vérifier d'autres propriétés de l'exception, nous pouvons utiliser la règle ExpectedException .

Voyons un exemple de vérification de la propriété message d'une exception:

@Rule public ExpectedException exceptionRule = ExpectedException.none(); @Test public void whenExceptionThrown_thenRuleIsApplied() { exceptionRule.expect(NumberFormatException.class); exceptionRule.expectMessage("For input string"); Integer.parseInt("1a"); }

Dans l'exemple ci-dessus, nous déclarons d'abord la règle ExpectedException . Ensuite, dans notre test, nous affirmons que le code qui tente d'analyser une valeur Integer se traduira par une NumberFormatException avec le message «For input string».

4. Conclusion

Dans cet article, nous avons couvert l'affirmation d'exceptions avec JUnit 4 et JUnit 5.

Le code source complet des exemples est disponible à l'adresse over sur GitHub.