JUnit 5: Comment faire valoir une exception est levée?
Est-il une meilleure façon d'affirmer qu'une méthode lève une exception dans JUnit 5?
Actuellement, je utiliser un @à la Règle, afin de vérifier que mon test déclenche une exception, mais cela ne fonctionne pas pour le cas où j'attends de multiples méthodes pour lever des exceptions dans mon test.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
assertThrows()
, qui vous permet de tester plusieurs exceptions dans le même test. Avec le soutien pour les lambdas de Java 8, c'est la manière canonique de test pour les exceptions dans JUnit.Par la JUnit docs:
() ->
points pour une expression lambda qui accepte des arguments zéro. Ainsi, la "production", qui devrait lancer l'exception est dans le bloc de code souligné (c'est à dire, lathrow new...
de la déclaration dans les accolades).() -> new IllegalArgumentException("a message");
(sans lethrow
mot-clé), que le compilateur n'aime pas pour une raison quelconque.thrown
de typeThrowable
au lieu deMyException
.assertThrows
renvoie typeT extends Throwable
(dans ce casMyException
) et pas seulement un générique throwable.Dans Java 8 et JUnit 5 (Jupiter), l'on peut affirmer pour les exceptions comme suit.
À l'aide de
org.junit.jupiter.api.Assertions.assertThrows
Cette approche permettra d'utiliser l'Interface Fonctionnelle
Executable
dansorg.junit.jupiter.api
.Consulter :
assertThrows(NoSuchElementException.class, myLinkedList::getFirst);
@Test(expected=...)
, mais que pouvez-vous faire?Ils ont changé dans JUnit 5 (prévu: InvalidArgumentException, réel: méthode invoquée) et le code ressemble à ceci:
Maintenant Junit5 fournit un moyen de faire valoir les exceptions
Vous pouvez tester les deux exceptions générales et les exceptions personnalisées
Une exception générale scénario:
ExpectGeneralException.java
ExpectGeneralExceptionTest.java
Vous pouvez trouver un exemple de test CustomException ici : affirmer le code de l'exception de l'échantillon
ExpectCustomException.java
ExpectCustomExceptionTest.java
Vous pouvez utiliser
assertThrows()
. Mon exemple est tiré de la documentation http://junit.org/junit5/docs/current/user-guide/Je pense que c'est encore plus simple exemple
Appel
get()
une option contenant un videArrayList
va jeter unNoSuchElementException
.assertThrows
déclare attendus exception à la règle et offre un lambda fournisseur (ne prend pas d'argument et retourne une valeur).Grâce à @prime pour sa réponse, qui je l'espérons, élaboré sur.
assertThrows
renvoie la levée d'une exception. Ainsi, vous pouvez faire commeNoSuchElementException e = assertThrows(NoSuchElementException.class, () -> opt2.get());
puis ci-dessous, vous pouvez faire ce genre d'affirmations sur l'objet de l'exception que vous voulez.En fait, je pense qu'il y a une erreur dans la documentation pour cet exemple particulier. La méthode qui est prévu est expectThrows
Ici est un moyen facile.
Il réussit seulement lorsque l'Exception que vous attendez est levée.
fail()
méthode dans le bloc try.Il y a 3 moyens de faire valoir une certaine exception dans Junit. Nous allons écrire les scénarios de test unitaire pour elle.
1. try-catch idiome
Cet idiome est l'un des plus populaires car il était utilisé déjà dans JUnit 3. Cette approche est un modèle commun. Le test échoue si aucune exception n'est levée et l'exception elle-même est vérifiée dans une clause catch.
2. @Test devrait annotation
Dans cette approche, nous préciser les attendus exception dans @Test comme ci-dessous
@Test(prévu = IllegalArgumentException.class)
Lorsque l'exception n'était pas levée, vous obtiendrez le message suivant: java.lang.AssertionError: Attendu exception: java.lang.IllegalArgumentException
Avec cette approche, vous devez être prudent, cependant. Parfois, il est tentant de s'attendre à ce général Exception RuntimeException ou même un Throwable. Et cela est considéré comme une mauvaise pratique parce que votre code peut lancer une exception dans d'autres endroits que vous ne le devrait et votre test sera toujours passer!
L'un des inconvénient de cette approche est que vous ne pouvez pas affirmer pour le message d'exception.
3. Junit @Règle
Le même exemple peut être créé à l'aide de ExceptedException règle. La règle doit être un champ marqué par @Règle d'annotation.
- Je trouver le code ci-dessus plus lisible donc je préfère utiliser cette approche.
Lorsque l'exception n'est pas levée, vous obtiendrez le message suivant: java.lang.AssertionError: essai Prévu à jeter (une instance de java.lang.IllegalArgumentException et d'exception avec le message “valeur Vide est passé.”). Assez agréable.
Mais pas toutes les exceptions, je vérifie avec l'approche ci-dessus. Parfois, j'ai besoin de vérifier que le type de l'exception levée puis-je utiliser l'annotation @Test.