web-dev-qa-db-de.com

Wie funktioniert Junit @Rule?

Ich möchte Testfälle für einen Großteil des Codes schreiben. Ich möchte Einzelheiten über die Annotationsfunktion von JUnit @Rule Erfahren, damit ich sie zum Schreiben von Testfällen verwenden kann. Bitte geben Sie einige gute Antworten oder Links an, die die Funktionsweise anhand eines einfachen Beispiels detailliert beschreiben.

182
Dipak

Mithilfe von Regeln werden zusätzliche Funktionen hinzugefügt, die für alle Tests innerhalb einer Testklasse gelten, jedoch allgemeiner.

Beispielsweise führt ExternalResource Code vor und nach einer Testmethode aus, ohne @Before Und @After Verwenden zu müssen. Die Verwendung eines ExternalResource anstelle von @Before Und @After Bietet Möglichkeiten für eine bessere Wiederverwendung von Code. Dieselbe Regel kann für zwei verschiedene Testklassen verwendet werden.

Das Design basierte auf: Interceptors in JUnit

Weitere Informationen finden Sie unter JUnit-Wiki: Regeln .

140
Matthew Farwell

Junit Rules arbeiten nach dem Prinzip des AOP (Aspect Oriented Programming). Es fängt die Testmethode ab und bietet so die Möglichkeit, einige Dinge vor oder nach der Ausführung einer bestimmten Testmethode zu erledigen.

Nehmen Sie das Beispiel des folgenden Codes:

public class JunitRuleTest {

  @Rule
  public TemporaryFolder tempFolder = new TemporaryFolder();

  @Test
  public void testRule() throws IOException {
    File newFolder = tempFolder.newFolder("Temp Folder");
    assertTrue(newFolder.exists());
  }
} 

Jedes Mal, wenn die obige Testmethode ausgeführt wird, wird ein temporärer Ordner erstellt und nach Ausführung der Methode gelöscht. Dies ist ein Beispiel für eine von Junit bereitgestellte Standardregel.

Ein ähnliches Verhalten kann auch durch die Erstellung eigener Regeln erreicht werden. Junit bietet die TestRule-Schnittstelle, die implementiert werden kann, um eine eigene Junit-Regel zu erstellen.

Hier ist ein nützlicher Link als Referenz:

55

Ich fand dieser Artikel erklärt @Rules ziemlich gut, besonders im letzten Abschnitt "Die Reihenfolge der Ereignisse im Detail"

21
Peter Perháč

tl; dr für die Funktionsweise: JUnit umschließt Ihre Testmethode mit einem Statement-Objekt, sodass statement.Execute () Ihren Test ausführt. Anstatt statement.Execute () direkt aufzurufen, um Ihren Test auszuführen, übergibt JUnit die Anweisung an eine TestRule mit der Annotation @Rule. Die Funktion "apply" der TestRule gibt eine neue Anweisung zurück, die der Anweisung mit Ihrem Test entspricht. Die Execute () -Methode der neuen Anweisung kann die Execute-Methode der Testanweisung aufrufen (oder nicht oder mehrmals aufrufen) und davor und danach tun, was immer sie will. Jetzt hat JUnit eine neue Anweisung, die mehr als nur den Test ausführt, und diese kann sie erneut an weitere Regeln übergeben, bevor sie schließlich Execute aufruft.

13