JUnit @Before vs @Rule

10

Ich verstehe das,

  • @Before und @BeforeClass werden vor jedem Test bzw. der gesamten Testklasse
  • ausgeführt
  • @Rule und @ClassRule umschließt jeden Test bzw. die gesamte Testklasse.

Nehmen wir an, ich muss einige Daten vor jeder Testmethode initialisieren,

Wie entscheide ich mich zwischen @Before und @Rule ? Unter welchen Bedingungen ist man einer anderen vorzuziehen? Die gleiche Frage gilt auch für @BeforeClass vs. @ClassRule .

    
sam 03.04.2017, 19:54
quelle

2 Antworten

11

Um @Rule zu verwenden, benötigen Sie eine Klasse, die TestRule (preferred) oder MethodRule implementiert, wie Sie lesen können hier . Während für @Before und @After eine neue Methode in jedem Testfall geschrieben werden muss, ist @Rule nicht vorhanden, da es sich nur um eine Instanziierung von bereits vorhandenem Code handelt.

Wenn Sie also @Before und @After für setUp() und tearDown() verwenden, die Sie in vielen Testfällen verwenden, ist es eigentlich eine bessere Idee, @Rule wegen% co_de zu verwenden %. Wenn Sie einen Testfall haben, für den eine eindeutige code reuse und / oder @Before benötigt wird, sind diese Annotationen vorzuziehen.

Für eine etwas ausführlichere Antwort mit ein paar Beispielen, schauen Sie sich hier an. Ajit erklärt es sehr gut.

    
Quwin 04.04.2017, 00:57
quelle
3

In der Tat, wie @Quwin vorgeschlagen hat, gemäß JUnit 4.12 API doc ,

  

TestRule kann alles tun, was vorher gemacht werden konnte   Methoden, die mit @Before , @After , @BeforeClass oder mit annotiert wurden    @AfterClass , aber TestRule s sind (1) mächtiger und (2) einfacher zu teilen   zwischen Projekten und Klassen.

Möglichkeiten, dass TestRule s leistungsfähiger sind :

Es gibt bekannte Implementierungsklassen von TestRule , bei denen es sich um nützliche Regeln handelt, die Sie sofort verwenden können,

  

Beispiele, wie dies nützlich sein kann, finden Sie in den bereitgestellten TestRules oder schreiben Sie Ihre eigenen:

     
  • ErrorCollector : Sammle mehrere Fehler in einer Testmethode
  •   
  • ExpectedException : mache flexible Behauptungen über geworfene Ausnahmen
  •   
  • ExternalResource : Starten und stoppen Sie einen Server, zum Beispiel
  •   
  • TemporaryFolder : Erstelle neue Dateien und lösche nach dem Test
  •   
  • TestName : Erinnern Sie sich an den Testnamen, der während der Methode
  • verwendet werden soll   
  • TestWatcher : Fügt Logik bei Ereignissen während der Methodenausführung hinzu
  •   
  • Timeout : bewirkt, dass der Test nach einer festgelegten Zeit fehlschlägt
  •   
  • Verifier : fehlgeschlagener Test, wenn der Objektstatus falsch ist
  •   

Ein weiterer Vorteil von Regeln ist, dass mehrere Regeln in einem einzelnen Testfall verwendet werden können. Sie können RuleChain verwenden, um die Reihenfolge anzugeben, in der die Regeln ausgeführt werden sollen.

    
sam 04.04.2017 15:41
quelle

Tags und Links