Gibt es bewährte Methoden, um Junit dazu zu bringen, eine Funktion einmal in einer Testdatei auszuführen, und sie sollte auch nicht statisch sein.
wie @BeforeClass
bei nicht statischer Funktion?
Hier ist eine hässliche Lösung:
@Before void init(){
if (init.get() == false){
init.set(true);
// do once block
}
}
Nun, das ist etwas, was ich nicht tun möchte, und ich suche nach einer integrierten Junit-Lösung.
Antworten:
Wenn Sie keine statischen Initialisierer für eine einmalige Initialisierung einrichten möchten und sich nicht speziell mit der Verwendung von JUnit befassen, schauen Sie sich TestNG an. TestNG unterstützt die nicht statische einmalige Initialisierung mit einer Vielzahl von Konfigurationsoptionen, die alle Anmerkungen verwenden.
In TestNG wäre dies gleichbedeutend mit:
Zum Abreißen,
Für das TestNG Äquivalent von JUnit 4 ist
@Before
und@After
können Sie verwenden@BeforeMethod
und@AfterMethod
jeweils.quelle
Eine einfache if-Anweisung scheint auch ziemlich gut zu funktionieren:
quelle
@AfterClass
Äquivalent zu erhalten, das nach Ablauf aller Tests abreißt?Die Verwendung eines leeren Konstruktors ist die einfachste Lösung. Sie können den Konstruktor in der erweiterten Klasse weiterhin überschreiben.
Aber es ist nicht optimal bei aller Vererbung. Aus diesem Grund verwendet JUnit 4 stattdessen Anmerkungen.
Eine andere Möglichkeit besteht darin, eine Hilfsmethode in einer Factory / Util-Klasse zu erstellen und diese Methode die Arbeit machen zu lassen.
Wenn Sie Spring verwenden, sollten Sie die
@TestExecutionListeners
Anmerkung in Betracht ziehen . So etwas wie dieser Test:Spring's
AbstractTestExecutionListener
enthält zum Beispiel diese leere Methode, die Sie überschreiben können:HINWEIS:
DependencyInjectionTestExecutionListener
Beim Hinzufügen von benutzerdefinierten Elementen NICHT übersehen / übersehenTestExecutionListeners
. Wenn Sie dies tun, werden alle Autodrähte seinnull
.quelle
beforeTestClass()
vor oder nach der Initialisierung des Kontexts aufgerufen?Verwenden Sie einfach
@BeforeAllMethods
/@AfterAllMethods
annotations, um eine Methode im Instanzkontext (nicht statisch) auszuführen, in der alle injizierten Werte verfügbar sind.Hierfür gibt es eine spezielle Testbibliothek:
https://mvnrepository.com/artifact/org.bitbucket.radistao.test/before-after-spring-test-runner/0.1.0
https://bitbucket.org/radistao/before-after-spring-test-runner/
Die einzige Einschränkung: funktioniert nur für Federprüfung.
(Ich bin der Entwickler dieser Testbibliothek)
quelle
Ich habe es noch nie versucht, aber vielleicht können Sie einen Konstruktor ohne Argumente erstellen und von dort aus Ihre Funktion aufrufen?
quelle
Der Artikel beschreibt 2 sehr schöne Lösungen für dieses Problem:
quelle
UPDATE: Bitte lesen Sie den Kommentar von Cherry, warum der folgende Vorschlag fehlerhaft ist. (Ich behalte die Antwort hier bei, anstatt sie zu löschen, da der Kommentar anderen nützliche Informationen darüber liefern kann, warum dies nicht funktioniert.)
Eine weitere Option, die bei Verwendung der Abhängigkeitsinjektion (z@PostConstruct
. B. Spring) in Betracht gezogen werden sollte, ist . Dies garantiert, dass die Abhängigkeitsinjektion abgeschlossen ist, was bei einem Konstruktor nicht der Fall wäre:quelle
@Before
und@After
Methoden 6 Mal aufgerufen! In diesem Zusammenhang@PostConstruct
verhält es sich also wie eine@Before
Anmerkung. Sie können es einfach testen: Fügen Sie einfach 2 Testmethoden in die Testklasse ein, fügen Sie hinzu@PostConstruct public void init() {System.out.println("started");}
und sehen Sie in den Protokollen, wie oft es gedruckt wird.@Test
Lauf beschrieben wurde: "Um die Methode auszuführen, erstellt JUnit zuerst eine neue Instanz der Klasse und ruft dann die mit Anmerkungen versehene Methode auf."Verwenden Sie einfach
@BeforeClass
:Es ist nicht sinnvoll
init
, nicht statisch zu sein, da jeder Test in einer separaten Instanz ausgeführt wird. Die Instanz, auf der ausgeführtinit
wird, stimmt nicht mit der Instanz eines Tests überein.Der einzige Grund, warum Sie möchten, dass es nicht statisch ist, besteht darin, es in Unterklassen zu überschreiben. Sie können dies jedoch auch mit statischen Methoden tun. Verwenden Sie einfach denselben Namen, und nur die Unterklassenmethode
init
wird aufgerufen.quelle