Accueil > Divers, Outillage > JUnit Rules

JUnit Rules

L’équipe de Kent Beck a récemment publié JUnit 4.7 qui n’apporte pas grand chose hormis la notion de Rule. Une Rule ressemble énormément à la notion d’intercepteur de l’AOP Alliance ou de TestExecutionListeners dans Spring.

A quoi celà peut-il servir en pratique? Dans les précédentes versions de JUnit 4, pour exécuter un traitement avant/après chaque méthode de test, on utilisait une méthode annotée @Before ou @After. Pour factoriser ce traitement sur plusieurs classes de tests, il fallait passer par une classe mère commune.

Dorénavant, on pourra isoler ce traitement dans une classe:

public class LogRule implements MethodRule {
    public Statement apply(final Statement base, final FrameworkMethod method, final Object target) {
        return new Statement() {
            public void evaluate() throws Throwable {
                try {
                    System.out.println("Begin " + method.getName() + " on " + target);
                    base.evaluate();
                    System.out.println("End " + method.getName() + " on " + target);
                } catch (Throwable ex) {
                    System.out.println("Exception " + method.getName() + " on " + target+": "+ex.getMessage());
                }
            }
        };
    }
}

puis le référencer dans un test, on ajoute un attribut public annoté @Rule:

public class ComplexTest {
    @Rule
    public LogRule logRule=new LogRule();
    @Test
    public void testAdd() { ... }
}

JUnit inclut quelques Rules basiques:

  • ExpectedException: vérifie qu’une exception est levée (généralise @Test(expected=...) à une classe de test)
  • Timeout: vérifie qu’un test ne dépasse pas une certaine durée (généralise @Test(timeout=...) à une classe de test
  • ExternalResource: base pour gérer une ressource: ouvrir/fermer une connexion par exemple
    • TemporaryFolder: créer/détruit un dossier temporaire pour les tests qui produisent des fichiers
  • TestWatchman: base pour observer l’exécution d’un test sans intervenir
    • TestName: donne accès au nom du test depuis la méthode de test
  • Verifier: base pour vérifier l’état de l’objet de test
    • ErrorCollector: recueille les erreurs sans interrompre un test

Gageons que des projets connexes à JUnit, comme DBUnit, tireront profit de cette notion.

  1. Pas encore de commentaire
  1. Pas encore de trackbacks