Access Keys:
Skip to content (Access Key - 0)

Cette article présente l'annotation @Rule et les MethodeRule

Depuis JUnit 4.7, une nouvelle annotation est apparue @Rule. Elle permet d'accroître de manière très intéressante les fonctionnalités de JUnit. Malheureusement, l'utilisation de l'annotation @Rule n'est pas très documentée. Cet article a donc pour objectif de vous éclairer sur ce sujet.

TestName : récupérer le nom de la méthode de test

Tout d'abord, voyons comment il nous est maintenant possible de récupérer le nom de la méthode de test. En JUnit3, c'était très simple car il suffisait d'étendre TestCase puis d'appeler la méthode getName() dans la méthode de test

Récupérer le nom de la méthode de test en JUnit3

Par contre, en JUnit4, on n'a plus d'équivalent aussi simple d'utilisation. Heureusement, l'introduction de l'annotation @Rule et des MethodRule comble cette lacune.
L'annotation @Rule s'applique à un attribut public dont le type implémente l'interface MethodRule. Les appels des méthodes de test seront alors interceptés (comme le ferait un framework AOP) pour redéfinir le comportement d'exécution du test ou le mettre en échec. Pour pouvoir récupérer la méthode de test, JUnit a déjà implémenter la MethodRule adéquate, TestName. Voici comment l'utiliser :

Récupérer le nom de la méthode de test en JUnit4

Bon, c'est sans doute plus compliqué à utiliser mais, au moins, c'est possible.

Timeout : mettre des timeouts sur des méthodes de test

Autre MethodRule intéressante, Timeout, elle permet de poser des timeout sur des méthodes de test ce qui peut dans des cas un peu limite être assez utile pour éviter qu'un test ne tourne à l'infini. Voilà un petit exemple illustrant son utilisation :

Récupérer le nom de la méthode de test en JUnit4

On obtient alors une exception claire du problème :



Implémenter une MethodRule

Pour avoir un exemple d'implémentation de MethodRule, je ne serai que vous conseiller l'article de Mathieu Carbou dont vous trouverez ci-dessous le code source.
Dans cet exmeple, il cherche à ce que les méthodes de tests soient chacune exécutées N fois en parallèle. Leur exécution prend une durée aléatoire puis lorsque le premier Thread se termine, une exception est lancée et est interceptée par la MethodRule qui la retourne au test.
L'exemple est un peu compliqué à comprendre si vous ne connaissez pas un peu la gestion du multithreading mais l'essentiel est de comprendre comment implémenter correctement une MethodRule.

Utilisation de la MethodRule appliquée à un test
Déclaration de l'annotation
Implémentation de la MethodRule gérant le retour d'exception
Adaptavist Theme Builder (4.2.3) Powered by Atlassian Confluence 3.5.5, the Enterprise Wiki