JUnit : Gérez-moi ces exceptions que je ne saurais voir

 
Le cas des tests unitaires a toujours été un sujet difficile à appréhender lors de la première rédaction de tests. Et c’est seulement avec le temps qu’on perfectionne nos tests.
Aujourd’hui j’espère vous faire gagner un tantinet de temps par rapport à la rédaction de tests JUnit traitant du cas des exceptions.

Restez général

Lorsque l’appel à une méthode peut déclencher une exception (exemple : NumberFormatException), la méthode @Test doit déclarer une exception de type Exception.
Il ne s’agit pas là d’une obligation mais plutôt d’une recommandation pour 2 raisons :

  • Si un jour la méthode testée peut déclencher une autre exception, vous n’aurez pas besoin de modifier vos méthodes @Test
  • Que ce soit NumberFormatException ou Exception, si une méthode @Test déclenche une exception elle marquera votre test comme échouant

Don’t

@Test
public void parseInt_validInput() throws NumberFormatException {
	Integer.parseInt("42");
}

Do

@Test
public void parseInt_validInput() throws Exception {
	Integer.parseInt("42");
}

Utilisez la puissance de @Test

Maintenant, rédigeons le JUnit qui va tester le cas où la méthode va déclencher une exception.
Comme tout le monde, la première fois j’ai englobé l’appel de ma méthode par un bloc try-catch, en mettant un Assert affreux dans le catch :

Assert.assertTrue(true);

Depuis j’ai trouvé que l’annotation @Test nous propose l’attribut « expected » qui permet de définir le type de l’exception attendue.

Don’t

@Test
public void parseInt_alphaInput() {
	try {
		Integer.parseInt("AZE");
		Assert.fail("An NumberFormatException must be thrown!");
	} catch (NumberFormatException nfe) {
		Assert.assertTrue(true);
	}
}

Do

@Test(expected = NumberFormatException.class)
public void parseInt_alphaInput() throws Exception {
	Integer.parseInt("AZE");
}

1 réflexion sur “JUnit : Gérez-moi ces exceptions que je ne saurais voir”

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *