web-dev-qa-db-fra.com

Junit @Rule et @ClassRule

J'écris le test JUnit4 dans lequel j'utilise la règle TemporaryFolder. Il semble que cela fonctionne bien avec @Rule et @ClassRule. Quelle est la différence entre Junit @Rule et @ClassRule? Pourquoi devrais-je en utiliser un et pas un autre? 

21
Viktar Kava

La distinction devient claire lorsque vous avez plusieurs méthodes de test dans une classe.

Un @ClassRule a sa méthode before() exécutée avant les méthodes de test. Ensuite, toutes les méthodes de test sont exécutées et enfin la méthode after() de la règle. Donc, si vous avez cinq méthodes de test dans une classe, before() et after() ne seront toujours exécutés qu’une fois.

@ClassRule s'applique à une méthode statique et a donc toutes les limitations inhérentes à celle-ci.

Un @Rule entraîne l'exécution des tests via la méthode apply() de la règle, qui peut effectuer des opérations avant et après l'exécution de la méthode cible. Si vous avez cinq méthodes de test, la fonction apply() de la règle est appelée cinq fois, en encapsulant chaque méthode.

Utilisez @ClassRule pour configurer quelque chose qui peut être réutilisé par toutes les méthodes de test, si vous pouvez y parvenir avec une méthode statique.

Utilisez @Rule pour configurer quelque chose qui doit être créé de nouveau, ou réinitialisé, pour chaque méthode de test. 

46
slim

@Rule ne peut pas être configuré pour s'exécuter avant un @BeforeClass. 

Alors que @ClassRule doit être sur la méthode statique. 

2
Slavus

Ref: Annote les champs statiques qui référencent des règles ou des méthodes qui les renvoient. Un champ doit être public, statique et un sous-type de TestRule. Une méthode doit être publique statique et renvoyer un sous-type de TestRule.

L'instruction transmise à la règle de test exécutera toutes les méthodes BeforeClass, puis le corps entier de la classe de test (toutes les méthodes contenues, s'il s'agit d'une classe de test JUnit standard, ou toutes les classes contenues, s'il s'agit d'une suite), et enfin toutes les méthodes AfterClass. méthodes.

https://junit.org/junit4/javadoc/4.12/org/junit/ClassRule.html

0
Omprakash