webentwicklung-frage-antwort-db.com.de

Junit @Rule und @ClassRule

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

21
Viktar Kava

Der Unterschied wird deutlich, wenn Sie mehr als eine Testmethode in einer Klasse haben.

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

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

Ein @Rule bewirkt, dass Tests über die apply()-Methode der Regel ausgeführt werden. Diese Methode kann vor und nach der Ausführung der Zielmethode ausgeführt werden. Wenn Sie über fünf Testmethoden verfügen, wird apply() der Regel fünfmal als Wrapper für jede Methode aufgerufen.

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

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

46
slim

@Rule kann nicht für die Ausführung vor einer @BeforeClass eingerichtet werden. 

@ClassRule muss auf einer statischen Methode sein. 

2
Slavus

Ref: Beschreibt statische Felder, die auf Regeln oder Methoden verweisen, die sie zurückgeben. Ein Feld muss public, static und ein Subtyp von TestRule sein. Eine Methode muss public static sein und einen Subtyp von TestRule zurückgeben.

Die an die TestRule übergebene Anweisung führt alle BeforeClass-Methoden aus, dann den gesamten Body der Testklasse (alle enthaltenen Methoden, wenn es sich um eine Standard-JUnit-Testklasse handelt, oder alle enthaltenen Klassen, wenn es sich um eine Suite handelt) und schließlich um alle AfterClass Methoden.

https://junit.org/junit4/javadoc/4.12/org/junit/ClassRule.html

0
Omprakash