TP-metaprogrammation-test/LanceurIndependant.java

118 lines
3.8 KiB
Java
Raw Normal View History

2021-12-03 14:53:43 +00:00
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<Throwable> 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);
}
}