24 Stimmen

Erzwingen einer neuen Version des Spring-Kontextes BEVOR der Test ausgeführt wird

Ich benutze die SpringJUnit4ClassRunner für das Schreiben von Integrationstests. Ich verwende auch @DirtiesContext für Tests, die den Kontext in einem kaputten Zustand zurücklassen, und das funktioniert einwandfrei.

Aber jetzt habe ich einen Test, der eine wichtige SystemProperty in einem statischen Initialisierer setzt, der wiederum im Spring-Kontext verwendet wird. Auch das funktioniert gut, wenn der Test allein ausgeführt wird. Aber wenn ich den Test mit anderen Tests ausführe, wird der Spring-Kontext bereits ohne diese Eigenschaft erstellt und wird von meinem neuen Test wiederverwendet.

Wie kann ich die Neuerstellung eines Spring-Kontextes in meinem Test erzwingen, der dann die geänderte Systemeigenschaft verwendet?

26voto

Johan Punkte 32850

Ab Frühjahr 4.2 wird die DreckStoffKontext Annotation unterstützt die folgenden neuen Phasen: BEFORE_CLASS , VOR_JEDER_TEST_METHODE y BEFORE_METHOD . So können Sie jetzt zum Beispiel tun:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(...)
@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)
public class MyTest {
   ..
}

17voto

Biju Kunjummen Punkte 47456

Pre-Spring 4.2:

Ich kann leider nur einen Hack vorschlagen - Sie haben recht, es scheint keine einfache Möglichkeit zu geben, einen neuen Anwendungskontext zu initialisieren, anstatt einen zwischengespeicherten Anwendungskontext zu verwenden. Dies sind einige der Workarounds, die ich vorschlagen kann:

  1. Verwenden Sie eine etwas andere @ContextConfiguration - Ein schneller und schmutziger Weg, dies zu tun, könnte darin bestehen, eine @ActiveProfiles Annotation in die Testklasse einfügen, so wird Spring gezwungen, den Kontext mit einem neuen Schlüssel zwischenzuspeichern ODER einen Dummy-Kontext mit Ihrer bestehenden Konfiguration als Importe zu definieren

  2. Ein Hack, aber JUnit 4.11+ erlaubt ein gewisses Maß an Kontrolle über die Reihenfolge der Testmethoden, es ist möglich, eine Testmethode direkt vor der Ziel-Testmethode zu haben und die Dummy-Testmethode zu haben, kommentiert mit @DirtiesContext Auf diese Weise wird beim Aufruf Ihrer Zielmethode ein neuer Kontext erstellt.

1voto

Aaron Digulla Punkte 308693

Es gibt mehrere Möglichkeiten:

  1. Sie können einen individuellen Spring-Kontext für diesen Test erstellen, indem Sie eine andere Konfiguration in ihn laden. Auf diese Weise ist Ihr Test völlig unabhängig von jedem anderen Test.
  2. Für diesen Test können Sie eine abgespeckte Konfiguration erstellen. Das würde dasselbe erreichen, wäre aber schneller.
  3. Erstellen Sie eine Testsuite, die diesen Test zuerst ausführt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X