comment gérer les exceptions dans junit
J'ai écrit quelques scénarios de test pour tester la méthode. Mais certaines méthodes de lever une exception. Suis-je la faire correctement?
private void testNumber(String word, int number) {
try {
assertEquals(word, service.convert(number));
} catch (OutOfRangeNumberException e) {
Assert.fail("Test failed : " + e.getMessage());
}
}
@Test
public final void testZero() {
testNumber("zero", 0);
}
Si je passe -45
, il échouera avec OutOfRangeException
mais je ne suis pas en mesure de tester exception spécifique comme @Test(Expected...)
Vous devez vous connecter pour publier un commentaire.
Une exception inattendue est un échec de test, de sorte que vous n'avez ni besoin ni envie d'attraper un.
Jusqu'à
service
ne pas jeter unIllegalArgumentException
parce questr
a un point décimal, ce sera un simple échec du test.Attendu exception devrait être traité par la possibilité
expected
argument de@Test
.Si le programmeur était paresseux et jeta
Exception
, ou s'il avaitservice
retour0.0
, le test échouera. Seulement unNPE
va réussir. Notez que les sous-classes de l'exception de travail. C'est rare pourNPE
s, mais commun avecIOException
s etSQLException
s.Dans les rares cas où vous souhaitez tester pour un message d'exception, vous utilisez le newish
ExpectedException
JUnit@Rule
.Maintenant, à moins que le setTemperature jette un
IAE
et le message contient la température de l'utilisateur tente de mettre, le test échoue. Cette règle peut être utilisée de manière plus complexe.Votre exemple peut être mieux traitées par:
Vous pouvez inline
testNumber
; maintenant, il ne nous aide pas beaucoup. Vous pouvez la transformer en un paramétrées de la classe de test.Retirer le bloc try-catch et ajouter
throws Exception
à votre méthode de test, comme:JUnit s'attend à défaut de tests permettra de lancer des Exceptions, votre capture est tout simplement l'arrêt de JUnit d'être en mesure de signaler correctement. Aussi de cette façon, la propriété attendue sur l'annotation @Test fonctionne.
Vous n'avez pas besoin d'attraper l'exception d'échouer le test. Juste le laisser aller (en déclarant
throws
) et ce sera un échec de toute façon.Un autre cas est quand vous avez réellement s'attendre à l'exception, alors vous mettre échoue à la fin du bloc try.
Par exemple:
Vous pouvez utiliser ce genre de test pour vérifier si votre code est bien la validation d'une entrée et poignées d'entrée non valide avec une bonne exception.
Il existe plusieurs stratégies que vous pouvez utiliser pour traiter avec les exceptions dans vos tests. Je pense que la JUnit des annotations et des try/catch idiome qui ont déjà été mentionnés ci-dessus. Je voudrais attirer l'attention de la Java 8 option d'expressions Lambda.
Par exemple donné:
}
Vous pouvez faire ceci:
Prendre un coup d'oeil à ce blog qui couvre la plupart des options, avec des exemples.
http://blog.codeleak.pl/2013/07/3-ways-of-handling-exceptions-in-junit.html
Et celui-ci explique la Java 8 Lambda option plus pleinement:
http://blog.codeleak.pl/2014/07/junit-testing-exception-with-java-8-and-lambda-expressions.html