Ich verstehe das,
@Before
und @BeforeClass
werden vor jedem Test bzw. der gesamten Testklasse @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
.
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.
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
, aberTestRule
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 TestmethodeExpectedException
: mache flexible Behauptungen über geworfene AusnahmenExternalResource
: Starten und stoppen Sie einen Server, zum BeispielTemporaryFolder
: Erstelle neue Dateien und lösche nach dem Test- verwendet werden soll
TestName
: Erinnern Sie sich an den Testnamen, der während der MethodeTestWatcher
: Fügt Logik bei Ereignissen während der Methodenausführung hinzuTimeout
: bewirkt, dass der Test nach einer festgelegten Zeit fehlschlägtVerifier
: 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.