Essayez de l'attraper dans un test Unitaire
Je suis en train d'écrire des tests unitaires pour une application qui existe déjà depuis longtemps. Certaines de ces méthodes j'ai besoin de tester sont construit comme ceci:
public void someMethod() throws Exception {
//do something
}
Si je veux tester ces méthodes que j'ai à écrire quelque chose comme ceci dans mon test unitaire:
@Test
public void someTest() {
try {
someMethod();
}
catch (Exception e) {
e.printStackTrace();
}
}
Est-il une bonne pratique de le faire? Ou est-il un autre moyen pour tester ces méthodes?
J'ai fait quelques recherches sur internet et j'ai trouvé quelques solutions avec le @Rule
d'annotation et de @Test(expected=Exception.class)
, mais qui ne fonctionne pas (Eclipse continue de s'afficher la someMethod()
ligne dans le test que de mal).
Je ne sais pas si ce sont de bonnes solutions, parce que je suis assez nouveau à l'ensemble de l'unité de test histoire.
Si quelqu'un qui sait beaucoup de choses sur ce qui pourrait m'aider, j'en serait vraiment reconnaissante.
- Ne supprime pas l'exception, sauf si vous voulez le test à passer si oui ou non l'exception est levée. Notez qu'un test qui passe "de savoir si ou de ne pas" quelque chose comme une exception se produit peut ne pas être utile.
- Vous pouvez laisser JUnit pour prendre soin de l'Exception en l'ajoutant à votre méthode sig: public void someTest() throws Exception. Cependant si vous voulez attraper l'Exception de vous-même pour affirmer qu'il soit caugt l'exemple que vous avez donné est bon pour aller.
- JUnit "prend soin de lui" grâce à l'impression de la trace de la pile et de ne pas le test.
- Oui, c'est vrai. Dans la convention si, en déclarant la levée d'une exception est de permettre à un niveau supérieur, cadre de poignée ou de la JVM. J'aurais été plus clair sur ce point.
- Si c'est une bonne idée dépend de ce que vous essayez de faire.
Vous devez vous connecter pour publier un commentaire.
Depuis
Exception
est un checked exception, vous pouvez soit:try...catch
déclaration, ouCe que vous avez là-haut fonctionne très bien, mais ma préférence personnelle est de déclarer l'exception levée. De cette façon, si une exception, je ne suis pas attendre est levée lors de l'exécution de l'épreuve, le test échouer.
Si nous avons besoin de voir si une exception est levée, alors vous avez la possibilité d'utiliser
@Rule
ou ajouter la valeur à la@Test
annotation directement.Dans JUnit 5, vous pouvez tirer parti de
Assertions.expectThrows
pour accomplir la même chose. Je suis moins familier avec cet ensemble car il n'est pas encore GA au moment de l'édition, mais il semble accepter uneExecutable
venant de JUnit 5.expected
dans@Test
n'est pas autorisé comme de JUnit 5.Est ce que vous pouvez faire, si l'exception ne devrait pas se produire. Une autre solution serait de lancer l'exception de la signature comme ceci:
La différence c'est que dans un cas, le test échouera avec une affirmation exception et dans l'autre cas, ce sera un échec parce que le test s'est écrasé. (comme quelque part dans votre code, vous obtenez un NPE et le test à cause de cela)
La raison pour laquelle vous avez à faire cela, c'est parce que l'Exception est un checked exception. Voir Contrôlés versus décoché exception
L' @Test(expected=Exception.class) est pour les tests, que voulez tester que l'exception sera levée.
Ne pas attraper votre application de l'exception dans votre code de test. Au lieu de cela, déclarer être jeté vers le haut.
Parce que, quand JUnit est
TestRunner
trouve une exception, il sera automatiquement journal comme unerror
pour le cas de test.Seulement si vous
testcase
s'attend à ce que la méthode doit jeté unException
vous devez utiliser@Test(expected=Exception.class)
ou intercepter l'exception.Dans d'autres cas, il suffit de jeter vers le haut avec,
Vous pouvez ajouter une exception dans la méthode d'essai de la signature. Alors, si vous êtes à tester si l'exception est levée, vous devez utiliser
@Test(expected=Exception.class)
. Dans le cas de test où l'exception a pas à être jetés, test passe avec succès.Il y a deux principales règles sur la façon de traiter les exceptions à Junit testeurs:
Si l'exception a été initié dans le code testé:
expected
attribut de laTest
annotation. Ou, si d'autres contrôles doivent être effectués sur l'objet de l'exception elle-même, de l'attraper et de l'ignorer. (Dans ce cas, il doit y avoir aussi un appel àAssert.fail
à la fin de latry
bloc, pour dire que l'exception n'a pas été produit).Exception.printStackTrace
est également utile).Si l'exception n'était pas originaire dans le code testé ou il n'est pas intéressant pour le test (par exemple, la plupart des IOExceptions sont produites au niveau du réseau, avant le test pourrait même être complété), renvoyer à la
throws
clause.Pourquoi vous devriez vous attendre une exception dans le testeur? Rappeler: Vous devriez code une méthode de test pour chaque résultat possible sur le code testé (dans le but d'atteindre un niveau de couverture de code): Dans votre cas, une méthode qui doit retourner avec succès, et au moins un autre qui doit produire une Exception.
Trois points de JUnit:
Tests doivent être précis, ils doivent de réussite ou d'échec sans ambiguïté basée uniquement sur la façon dont le test entrées sont mis en place.
Tests devraient avoir des échecs rapportés dans le cadre.
Tests ne doivent pas compter sur d'avoir leur sortie lire.
Votre exemple échoue sur tous les trois chefs d'accusation. Si une exception est lancée ou non, le test passe. Si une exception est levée JUnit jamais l'apprend et ne peut pas l'inclure dans les résultats du test. La seule façon de savoir quelque chose s'est mal passé, c'est de lire le test écrit sur la sortie standard, ce qui rend les erreurs faciles à ignorer. Ce n'est pas un moyen utile pour écrire des tests.
JUnit a été conçu pour vous aider à faire la bonne chose facile, et pour donner aux développeurs une rétroaction utile. Si une exception est lancée à partir d'une méthode de test, il se fait attraper par le cadre. Si le test a été annoté avec une exception indiquant que l'exception est prévue, puis le cadre des marques de l'essai, comme en passant. Sinon le cadre échoue le test et les enregistrements de la stacktrace pour les rapports. Le cadre des rapports que les assertions de l'échec et de ce que l'exception inattendue s'est produite alors que tout le monde sait que si le test a fonctionné ou pas.
Si vous vous attendez à un test de réussir sans jeter une exception, si quoi que ce soit dans le test peut jeter un checked exception, ajouter
throws Exception
à l'épreuve signature de la méthode. L'ajout de lathrows
à la signature ne veut pas dire que la méthode a pour jeter quoi que ce soit, il laisse toutes les exceptions qui se produisent à se faire jeter de sorte que le framework de test peut les attraper.Le seul cas où vous auriez fait intercepter l'exception de l'essai est l'endroit où vous souhaitez tester des assertions à propos de l'exception; par exemple, vous pouvez tester que le message sur l'exception est ce que vous attendez, ou si l'exception a une cause fixés sur elle. Dans ce cas, vous devrez ajouter
Assert.fail()
à la fin de l'essai, bloc de sorte que n'ayant pas une exception sera la cause du test à l'échec.Lorsque vous écrivez un test à la première, pour le faire échouer. De cette façon, vous prouver à vous-même que vous savez ce que le test est en train de faire, et de vous confirmer que, quand il y a une panne, vous serez informé.
Quel type d'exception est-il? Est-il
Si c'est 1. Je voudrais juste le mettre à la signature de la méthode d'un try-catch sert pas d'autre but réel que de cérémonie.
Si c'est 2. elle devient un peu plus compliqué. Vous devez vous demander ce qui devrait arriver si l'Exception est levée. Si le test échoue? Est-il prévu? Est-il indifférent? Les exemples ci-dessous de façon à gérer toutes ces. ATTENTION: je n'ai utilisé Exception parce que vous l'avez fait. J'espère que ce n'est vraiment pas bien, parce que si c'est possible pour certains autres exception autre que le alors ils seront très bancale. Si possible, ne pas utiliser de
Exception
, utilisez quelque chose de plus spécifique (dans la junit et code).JMSException
,IOException
ouConfigurationException
🙂 Merci pour votre réponse instructive!Exception
sauf si vous dire vraiment (tests de quelque chose quithrows Exception
par exemple), même des noms commeSomeCheckedException
ouSomeUncheckedException
vraiment expliquer le problème à la main.fail()
. En fait, c'est très bien pour tous les tests unitaires pour déclarerException
depuis la méthode d'essai est (devrait!) jamais appelé à partir de n'importe où, sauf le framework de test. Et ce dernier laisse le test échoue dans le cas d'une exception qui est exactement ce que vous voulez.