Je comprends que,
@Before
et @BeforeClass
exécuter avant chaque test, ou la classe de test entière, respectivement@Rule
et @ClassRule
encapsule chaque test, ou la classe de test entière, respectivement.Disons que je dois initialiser certaines données avant chaque méthode de test,
Comment décider entre l'utilisation de @Before
et @Rule
? Dans quelles conditions est-on préféré à un autre? La même question vaut aussi pour @BeforeClass
contre.@ClassRule
.
Pour utiliser @Rule
, Vous avez besoin d'une classe qui implémente TestRule
(préféré) ou MethodRule
, comme on peut le lire ici . Alors que @Before
Et @After
Nécessitent l'écriture d'une nouvelle méthode dans chaque cas de test, @Rule
Ne le fait pas car il ne s'agit que d'une instanciation de code déjà existant.
Donc, si vous utiliseriez @Before
Et @After
Pour setUp()
et tearDown()
que vous utiliserez dans de nombreux cas de test, il s'agit en fait d'un meilleure idée d'utiliser @Rule
à cause de code reuse
. Si vous avez un scénario de test qui nécessite un @Before
Et/ou @After
Unique, ces annotations sont préférables.
Pour une réponse un peu plus élaborée avec quelques exemples, jetez un oeil ici . Ajit l'explique très bien.
En effet, comme l'a suggéré @Quwin, selon JUnit 4.12 API doc ,
TestRule
peut faire tout ce qui pouvait être fait auparavant avec des méthodes annotées avec@Before
,@After
,@BeforeClass
, ou@AfterClass
, maisTestRule
s sont (1) plus puissants , et (2) plus facilement partagé entre projets et classes.
Façons dont TestRule
s sont plus puissants:
Il existe des classes d'implémentation connues de TestRule
, qui sont des règles utiles que vous pouvez utiliser dès le départ,
Pour des exemples de la façon dont cela peut être utile, consultez les règles de test fournies ou écrivez les vôtres:
ErrorCollector
: collecte plusieurs erreurs dans une méthode de testExpectedException
: faire des assertions flexibles sur les exceptions levéesExternalResource
: démarrer et arrêter un serveur, par exempleTemporaryFolder
: créez de nouveaux fichiers et supprimez-les après le testTestName
: mémoriser le nom du test à utiliser pendant la méthodeTestWatcher
: ajout de logique lors d'événements lors de l'exécution de la méthodeTimeout
: échec du test après un temps définiVerifier
: échec du test si l'état de l'objet est incorrect
Un autre avantage des règles est que plusieurs règles peuvent être utilisées dans un seul cas de test. Vous souhaiterez peut-être utiliser RuleChain
pour spécifier l'ordre dans lequel les règles doivent être exécutées.