import java.lang.reflect.*; import java.util.*; /** * L'objectif est de faire un lanceur simple sans utiliser toutes les clases de * notre architecture JUnit. Il permet juste de valider la compréhension de * l'introspection en Java. */ public class LanceurIndependant { private int nbTestsLances; private int nbErreurs; private int nbEchecs; private List erreurs = new ArrayList<>(); public LanceurIndependant(String... nomsClasses) { System.out.println(); // Lancer les tests pour chaque classe for (String nom : nomsClasses) { try { System.out.println(nom + " : "); this.testerUneClasse(nom); System.out.println(); } catch (ClassNotFoundException e) { System.out.println("Classe inconnue !"); } catch (Exception e) { System.out.println("Problème : " + e); e.printStackTrace(); } } // Afficher les erreurs for (Throwable e : erreurs) { System.out.println(); e.printStackTrace(); } // Afficher un bilan System.out.printf("%d tests lancés dont %d échecs et %d erreurs.", nbTestsLances, nbEchecs, nbErreurs); } public int getNbTests() { return this.nbTestsLances; } public int getNbErreurs() { return this.nbErreurs; } public int getNbEchecs() { return this.nbEchecs; } private void testerUneClasse(String nomClasse) throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException, SecurityException { // Récupérer la classe Class classe = Class.forName(nomClasse); // Récupérer les méthodes "preparer" et "nettoyer" Method preparer, nettoyer; try { preparer = classe.getMethod("preparer"); } catch (NoSuchMethodException e) { preparer = null; } try { nettoyer = classe.getMethod("nettoyer"); } catch (NoSuchMethodException e) { nettoyer = null; } // Instancier l'objet qui sera le récepteur des tests // Object objet = classe.newInstance(); Object objet = classe.getDeclaredConstructor().newInstance(); // Exécuter les méthods de test Method[] methods = classe.getMethods(); for (Method method : methods) { if (method.getName().startsWith("test")) { this.nbTestsLances++; if (preparer != null) { preparer.invoke(objet); } try { method.invoke(objet); System.out.println(method.getName() + " : success"); } catch (InvocationTargetException e) { if (e.getCause() instanceof Echec) { System.out.println(method.getName() + " : echec"); this.erreurs.add(e); this.nbEchecs++; } else { System.out.println(method.getName() + " : erreur"); this.erreurs.add(e); this.nbErreurs++; } } catch (java.lang.IllegalArgumentException e) { System.out.println(method.getName() + " : erreur, n'est pas un test"); this.nbErreurs++; } if (nettoyer != null) { nettoyer.invoke(objet); } } } } public static void main(String... args) { LanceurIndependant lanceur = new LanceurIndependant(args); } }