J'avais rendu privé le constructeur de ma classe de fonctions utilitaires statiques, pour satisfaire CheckStyle. Mais comme l'a dit l'auteur original, j'avais Cobertura qui se plaignait du test. Au début, j'ai essayé cette approche, mais cela n'affecte pas le rapport de couverture car le constructeur n'est jamais réellement exécuté. Donc tout ce que ces tests font vraiment, c'est vérifier si le constructeur reste privé - ce qui est redondant avec la vérification d'accessibilité dans le test suivant.
@Test(expected=IllegalAccessException.class)
public void testConstructorPrivate() throws Exception {
MyUtilityClass.class.newInstance();
fail("Le constructeur de la classe utilitaire doit être privé");
}
J'ai suivi la suggestion de Javid Jamae et utilisé la réflexion, mais j'ai ajouté des assertions pour attraper quiconque manipulerait la classe testée (et j'ai nommé le test pour indiquer des Niveaux Élevés de Mal).
@Test
public void evilConstructorInaccessibilityTest() throws Exception {
Constructor[] ctors = MyUtilityClass.class.getDeclaredConstructors();
assertEquals("La classe utilitaire ne devrait avoir qu'un seul constructeur",
1, ctors.length);
Constructor ctor = ctors[0];
assertFalse("Le constructeur de la classe utilitaire devrait être inaccessible",
ctor.isAccessible());
ctor.setAccessible(true); // évidemment, nous ne ferions jamais cela en production
assertEquals("Vous vous attendez à ce que le constructeur retourne le type attendu",
MyUtilityClass.class, ctor.newInstance().getClass());
}
C'est un peu exagéré, mais je dois admettre que j'aime la sensation chaleureuse et réconfortante d'une couverture à 100% des méthodes.
0 votes
Il me semble que vous essayez d'appliquer le pattern Singleton. Si c'est le cas, vous pourriez aimer dp4j.com (qui fait exactement ça)
0 votes
Ne devrait-il pas être remplacé par la levée d'une exception intentionnellement vide? Dans ce cas, vous pourriez écrire un test qui s'attend à cette exception spécifique avec un message spécifique, non? pas sûr si c'est exagéré