Tu abordes ça de la mauvaise façon. Testez simplement votre fonctionnalité : si une exception est levée, le test échouera automatiquement. Si aucune exception n'est levée, vos tests seront tous verts.
J'ai remarqué que cette question suscite de temps en temps de l'intérêt, je vais donc m'étendre un peu.
Contexte des tests unitaires
Lorsque vous effectuez des tests unitaires, il est important de définir pour vous-même ce que vous considérez comme une unité de travail. En gros : une extraction de votre base de code qui peut inclure ou non plusieurs méthodes ou classes et qui représente un seul élément de fonctionnalité.
Ou, comme défini dans L'art des tests unitaires, 2e édition par Roy Osherove , page 11 :
A test unitaire est un morceau de code automatisé qui invoque l'unité de travail testée, puis vérifie certaines hypothèses sur un seul résultat final de cette unité. Un test unitaire est presque toujours écrit en utilisant un cadre de test unitaire. Il peut être écrit facilement et s'exécute rapidement. Il est fiable, lisible et facile à maintenir. Il est cohérent dans ses résultats tant que le code de production n'a pas changé.
Ce qu'il faut comprendre, c'est qu'une unité de travail En général, il n'y a pas qu'une seule méthode, mais au niveau le plus élémentaire, il s'agit d'une méthode qui est ensuite encapsulée dans d'autres unités de travail.
L'idéal serait de disposer d'une méthode de test pour chaque unité de travail distincte afin de pouvoir toujours voir immédiatement où les choses ne vont pas. Dans cet exemple, il y a une méthode de base appelée getUserById()
qui retournera un utilisateur et il y a un total de 3 unités de travaux.
La première unité de travail doit tester si un utilisateur valide est renvoyé ou non dans le cas d'une entrée valide et invalide.
Toutes les exceptions lancées par la source de données doivent être traitées ici : si aucun utilisateur n'est présent, il doit y avoir un test qui démontre qu'une exception est lancée lorsque l'utilisateur est introuvable. Un exemple de ceci pourrait être le test IllegalArgumentException
qui est attrapé avec le @Test(expected = IllegalArgumentException.class)
annotation.
Une fois que vous avez traité tous vos cas d'utilisation pour cette unité de travail de base, vous passez au niveau supérieur. Ici, vous faites exactement la même chose, mais vous ne traitez que les exceptions qui proviennent du niveau juste en dessous du niveau actuel. Votre code de test reste ainsi bien structuré et vous permet de parcourir rapidement l'architecture pour trouver où les choses ne vont pas, au lieu de devoir sauter partout.
Traitement des entrées valides et erronées d'un test
À ce stade, il devrait être clair comment nous allons gérer ces exceptions. Il y a 2 types d'entrée : valide l'entrée et défectueux (l'entrée est valide au sens strict, mais elle n'est pas correcte).
Lorsque vous travaillez avec valide tu t'attends implicitement à ce que le test que tu écris fonctionne.
Un tel appel de méthode peut ressembler à ceci : existingUserById_ShouldReturn_UserObject
. Si cette méthode échoue (par exemple, si une exception est levée), vous savez que quelque chose ne va pas et vous pouvez commencer à creuser.
En ajoutant un autre test ( nonExistingUserById_ShouldThrow_IllegalArgumentException
) qui utilise le défectueux et attend une exception, vous pouvez voir si votre méthode fait ce qu'elle est censée faire avec une entrée erronée.
TL;DR
Vous essayiez de faire deux choses dans votre test : vérifier les entrées valides et erronées. En divisant cette méthode en deux qui font chacune une chose, vous aurez des tests beaucoup plus clairs et une meilleure vue d'ensemble de ce qui ne va pas.
En gardant à l'esprit l'unité de travail en couches, vous pouvez également réduire la quantité de tests dont vous avez besoin pour une couche supérieure dans la hiérarchie, car vous n'avez pas à tenir compte de tout ce qui aurait pu mal tourner dans les couches inférieures : les couches inférieures à la couche actuelle sont une garantie virtuelle que vos dépendances fonctionnent et si quelque chose ne va pas, c'est dans votre couche actuelle (en supposant que les couches inférieures ne lancent pas d'erreurs elles-mêmes).
14 votes
Un test JUnit est considéré comme ayant échoué s'il lève une exception autre qu'une exception attendue. En général, aucune exception n'est attendue.
2 votes
N'y a-t-il pas une distinction entre échec et erreur dans JUnit ? Le premier signifie que le test a échoué, le second que quelque chose d'inattendu s'est produit.
2 votes
Duplicata possible de Comment puis-je tester si une exception particulière n'est pas levée ?