2016-12-13 30 views
13

Ich schreibe JUnit4 Test, in dem ich die TemporaryFolder-Regel verwende. Es scheint, dass es sowohl mit @Rule als auch mit @ClassRule funktioniert. Was ist der Unterschied zwischen Junit @Rule und @ClassRule? Warum sollte ich einen und keinen anderen benutzen?Junit @Rule und @ClassRule

Antwort

23

Die Unterscheidung wird deutlich, wenn Sie mehr als eine Testmethode in einer Klasse haben.

Eine @ClassRule hat ihre before() Methode vor einer der Testmethoden ausgeführt. Dann werden alle Testmethoden ausgeführt und schließlich die Methode der Regel after(). Wenn Sie also fünf Testmethoden in einer Klasse haben, werden before() und after() immer nur einmal ausgeführt.

@ClassRule gilt für eine statische Methode und hat daher alle damit verbundenen Einschränkungen.

Ein @Rule bewirkt, dass Tests über die Methode apply() der Regel ausgeführt werden, die vor und nach dem Ausführen der Zielmethode Vorgänge ausführen kann. Wenn Sie fünf Testmethoden haben, wird die Regel apply() fünfmal aufgerufen, als Wrapper für jede Methode.

Verwenden Sie @ClassRule, um etwas einzurichten, das von allen Testmethoden wiederverwendet werden kann, wenn Sie dies in einer statischen Methode erreichen können.

Verwenden Sie @Rule, um etwas einzurichten, das für jede Testmethode neu erstellt oder zurückgesetzt werden muss.

1

@Rule kann nicht vor einer @BeforeClass ausgeführt werden.

Während @ClassRule muss auf statische Methode sein.