J'ai écrit quelques tests JUnit avec @Test
annotation. Si ma méthode de test lève une exception vérifiée et si je veux affirmer le message avec l'exception, existe-t-il un moyen de le faire avec l' @Test
annotation JUnit ? AFAIK, JUnit 4.7 ne fournit pas cette fonctionnalité mais est-ce que les futures versions la fourniront? Je sais qu'en .NET, vous pouvez affirmer le message et la classe d'exception. Vous recherchez une fonctionnalité similaire dans le monde Java.
C'est ce que je veux:
@Test (expected = RuntimeException.class, message = "Employee ID is null")
public void shouldThrowRuntimeExceptionWhenEmployeeIDisNull() {}
@expectedExceptionMessage
annotation dans PHPUnit.Réponses:
Vous pouvez utiliser l'
@Rule
annotation avecExpectedException
, comme ceci:Notez que l'exemple dans la
ExpectedException
documentation est (actuellement) erroné - il n'y a pas de constructeur public, vous devez donc l'utiliserExpectedException.none()
.la source
expectMessage
été spécifié en tant que chaîne vide, la comparaison du message n'a pas été effectuéethrows RuntimeException
après avoir ajouté du code qui lève une exception. Ne l'attrapez pas ...failure.expectMessage(CoreMatchers.equalTo(...))
J'aime la
@Rule
réponse. Cependant, si pour une raison quelconque vous ne souhaitez pas utiliser de règles. Il existe une troisième option.la source
Devez-vous utiliser
@Test(expected=SomeException.class)
? Lorsque nous devons affirmer le message réel de l'exception, c'est ce que nous faisons.la source
@Test(expected=...)
etExpectedException
, c'est que j'ai vu à plusieurs reprises quelqu'un oublier de mettre l'appelfail()
à la fin dutry
bloc . S'il n'est pas détecté par la révision du code, votre test peut être faux positif et toujours réussir.Dans JUnit 4.13, vous pouvez faire:
Cela fonctionne également dans JUnit 5 mais avec des importations différentes:
la source
En fait, la meilleure utilisation est avec try / catch. Pourquoi? Parce que vous pouvez contrôler l'endroit où vous attendez l'exception.
Considérez cet exemple:
Que se passe-t-il si un jour le code est modifié et que la préparation du test génère une exception RuntimeException? Dans ce cas, le test réel n'est même pas testé et même s'il ne déclenche aucune exception, le test réussit.
C'est pourquoi il est préférable d'utiliser try / catch que de s'appuyer sur l'annotation.
la source
RuntimeException
comme exemple, remplacez cette exception par toute autre exception.Raystorm avait une bonne réponse. Je ne suis pas non plus un grand fan des règles. Je fais quelque chose de similaire, sauf que je crée la classe d'utilité suivante pour aider la lisibilité et l'utilisabilité, qui est l'un des gros avantages des annotations en premier lieu.
Ajoutez cette classe d'utilitaires:
Ensuite, pour mon test unitaire, tout ce dont j'ai besoin est ce code:
la source
Si vous utilisez @Rule, le jeu d'exceptions est appliqué à toutes les méthodes de test de la classe Test.
la source
Je n'ai jamais aimé la façon d'affirmer des exceptions avec Junit. Si j'utilise le «attendu» dans l'annotation, il me semble que nous violons le modèle «donné, quand, puis» parce que le «alors» est placé en haut de la définition du test.
De plus, si nous utilisons "@Rule", nous devons faire face à tant de code standard. Donc, si vous pouvez installer de nouvelles bibliothèques pour vos tests, je vous suggère de jeter un œil à AssertJ (cette bibliothèque est désormais livrée avec SpringBoot)
Ensuite, un test qui ne viole pas les principes "donnés / quand / alors", et il est fait en utilisant AssertJ pour vérifier:
1 - L'exception est ce que nous attendons. 2 - Il a aussi un message attendu
Ressemblera à ceci:
la source
J'aime la réponse de user64141 mais j'ai trouvé qu'elle pourrait être plus généralisée. Voici mon point de vue:
Notez que laisser l'instruction "fail" dans le bloc try provoque la capture de l'exception d'assertion associée; l'utilisation de return dans l'instruction catch empêche cela.
la source
Importez la bibliothèque catch-exception et utilisez-la. C'est beaucoup plus propre que la
ExpectedException
règle ou atry-catch
.Exemple de leurs documents:
la source
la source
Junit
mais votre réponse donneTestNG