2017-04-03 3 views
9

Ich verstehe, dass,JUnit @Before vs @Rule

  • @Before und @BeforeClass Lauf vor jedem Test, oder die gesamten Testklasse bzw.
  • @Rule und @ClassRule Wraps jeden Test oder die gesamte Testklasse, beziehungsweise.

Sagen wir, ich vor jedem Testverfahren, einige Daten initialisieren, müssen

Wie kann ich entscheiden zwischen @Before und @Rule mit? Unter welchen Bedingungen wird man einem anderen vorgezogen? Die gleiche Frage gilt auch für @BeforeClass vs @ClassRule.

+0

Ein mögliches Duplikat wurde vorgeschlagen http://StackOverflow.com/Questions/20295578, aber diese Frage adressiert nicht, wann "@ Rule" vs. "@ Before" zu verwenden ist – sam

Antwort

10

Um @Rule zu verwenden, benötigen Sie eine Klasse, die TestRule (bevorzugt) oder MethodRule implementiert, kann als here gelesen werden. Während @Before und @After erfordern, dass in jedem Testfall eine neue Methode geschrieben wird, ist das @Rule nicht, da es sich nur um eine Instanziierung bereits vorhandenen Codes handelt.

Also, wenn Sie @Before und @After für setUp() verwenden würden und tearDown(), die Sie in vielen Testfällen verwenden werden, ist es eigentlich eine bessere Idee @Rule zu verwenden, weil die code reuse. Wenn Sie einen Testfall haben, der eine eindeutige @Before und/oder @After erfordert, dann sind diese Anmerkungen vorzuziehen.

Für eine etwas ausführlichere Antwort mit ein paar Beispielen, werfen Sie einen Blick auf here. Ajit erklärt es sehr gut.

3

der Tat, wie @Quwin vorgeschlagen, accoridng zu JUnit 4.12 API doc,

TestRule kann alles, was @AfterClass mit @Before, @After, @BeforeClass oder kommentierten zuvor mit Methoden durchgeführt werden konnte, aber TestRule s sind (1) leistungsfähiger, und (2) leichter geteilt zwischen Projekten und Klassen.


Ways, dass TestRule s sind mächtiger:

Es gibt bekannte Klassen der TestRule Implementierung, die einige Nützliches Regeln sind, können Sie out-of-the-Box verwenden,

Für Beispiele, wie dies nützlich sein kann, sehen Sie diese bereitgestellten TestRules, oder schreiben Sie Ihre eigene:

  • ErrorCollector: machen flexible Aussagen über ausgelöste Ausnahmen
  • ExternalResource: mehrere Fehler in einem Testverfahren
  • ExpectedException sammeln starten und einen Server, beispielsweise
  • TemporaryFolder stoppen: erstellen frische Dateien und löschen nach Test
  • TestName: merken Sie sich den Testnamen für die Verwendung während der Methode
  • TestWatcher: Logik bei Ereignissen während Methode e hinzufügen xecution
  • Timeout: Ursache Test
  • Verifier nach einer bestimmten Zeit zum Scheitern verurteilt: Fail-Test, wenn Objektzustand

Einen weiteren Vorteil der Regeln falsch landet ist, dass mehrere Regeln in einem einzigen verwendet werden können, Testfall. Sie können RuleChain verwenden, um die Reihenfolge anzugeben, in der die Regeln ausgeführt werden sollen.