web-dev-qa-db-fra.com

JUnit @Before vs @Rule

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.

26
sam

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.

26
Quwin

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, mais TestRules sont (1) plus puissants , et (2) plus facilement partagé entre projets et classes.


Façons dont TestRules 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 test
  • ExpectedException: faire des assertions flexibles sur les exceptions levées
  • ExternalResource: démarrer et arrêter un serveur, par exemple
  • TemporaryFolder: créez de nouveaux fichiers et supprimez-les après le test
  • TestName: mémoriser le nom du test à utiliser pendant la méthode
  • TestWatcher: ajout de logique lors d'événements lors de l'exécution de la méthode
  • Timeout: échec du test après un temps défini
  • Verifier: é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.

7
sam