Existe-t-il une meilleure façon d'affirmer qu'une méthode lève une exception dans JUnit 5?
Actuellement, je dois utiliser une @Rule afin de vérifier que mon test lève une exception, mais cela ne fonctionne pas dans les cas où je m'attends à ce que plusieurs méthodes lèvent des exceptions dans mon test.
java
junit
junit5
junit-jupiter
steventrouble
la source
la source
Réponses:
Vous pouvez utiliser
assertThrows()
ce qui vous permet de tester plusieurs exceptions dans le même test. Avec la prise en charge des lambdas dans Java 8, c'est la manière canonique de tester les exceptions dans JUnit.Selon les documents JUnit :
la source
() ->
pointe vers une expression lambda qui accepte zéro argument. Ainsi, le "code de production" qui devrait lever l'exception est dans le bloc de code pointé (c'est- à -dire l'throw new...
instruction entre crochets).En Java 8 et JUnit 5 (Jupiter), nous pouvons affirmer les exceptions comme suit. En utilisant
org.junit.jupiter.api.Assertions.assertThrows
Cette approche utilisera l'interface fonctionnelle
Executable
dansorg.junit.jupiter.api
.Référer :
la source
assertThrows(NoSuchElementException.class, myLinkedList::getFirst);
Ils l'ont changé dans JUnit 5 (attendu: InvalidArgumentException, actual: méthode invoquée) et le code ressemble à celui-ci:
la source
Maintenant Junit5 fournit un moyen d'affirmer les exceptions
Vous pouvez tester à la fois les exceptions générales et les exceptions personnalisées
Un scénario d'exception général:
ExpectGeneralException.java
ExpectGeneralExceptionTest.java
Vous pouvez trouver un exemple pour tester CustomException ici: affirmer l'exemple de code d'exception
ExpectCustomException.java
ExpectCustomExceptionTest.java
la source
Je pense que c'est un exemple encore plus simple
Faire appel
get()
à une option contenant un videArrayList
lancera unNoSuchElementException
.assertThrows
déclare l'exception attendue et fournit un fournisseur lambda (ne prend aucun argument et renvoie une valeur).Merci à @prime pour sa réponse que j'espère avoir développée.
la source
assertThrows
renvoie l'exception levée. Vous pouvez donc faire commeNoSuchElementException e = assertThrows(NoSuchElementException.class, () -> opt2.get());
ci-dessous, vous pouvez faire toutes sortes d'assertions sur l'objet d'exception que vous souhaitez.Vous pouvez utiliser
assertThrows()
. Mon exemple est tiré de la documentation http://junit.org/junit5/docs/current/user-guide/la source
Une doublure encore plus simple. Aucune expression lambda ou accolade n'est requise pour cet exemple utilisant Java 8 et JUnit 5
la source
En fait, je pense qu'il y a une erreur dans la documentation de cet exemple particulier. La méthode prévue est expectThrows
la source
Voici un moyen simple.
Il ne réussit que lorsque l'exception que vous attendez est levée.
la source