Ich möchte einige Tests schreiben, die die XML Spring-Konfiguration einer bereitgestellten WAR überprüfen. Leider erfordern einige Beans, dass einige Umgebungsvariablen oder Systemeigenschaften festgelegt werden. Wie kann ich eine Umgebungsvariable festlegen, bevor die Spring Beans initialisiert werden, wenn der praktische Teststil mit @ContextConfiguration verwendet wird?
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:whereever/context.xml")
public class TestWarSpringContext { ... }
Wenn ich den Anwendungskontext mit Anmerkungen konfiguriere, wird kein Hook angezeigt, an dem ich etwas tun kann, bevor der Frühlingskontext initialisiert wird.
java
spring
environment-variables
spring-test
Hans-Peter Störr
quelle
quelle
@BeforeClass
Methode zum Festlegen der Systemeigenschaft und eine@AfterClass
Methode zum Entfernen der Systemeigenschaft funktionieren und nach sich selbst aufräumen. (Ich habe es aber nicht ausprobiert.)Der richtige Weg, dies ab Spring 4.1 zu tun, ist die Verwendung einer
@TestPropertySource
Anmerkung.Siehe @TestPropertySource in den Spring-Dokumenten und Javadocs .
quelle
@TestPropertySource(properties={"spring.cloud.config.label=feature/branch"})
Environment
Eigenschaft bereit , die sich von einer "Umgebungsvariablen" unterscheidet.Sie können auch einen Test ApplicationContextInitializer verwenden, um eine Systemeigenschaft zu initialisieren:
und konfigurieren Sie es dann in der Testklasse zusätzlich zu den Speicherorten der Spring-Kontextkonfigurationsdatei:
Auf diese Weise kann eine Codeduplizierung vermieden werden, wenn für alle Komponententests eine bestimmte Systemeigenschaft festgelegt werden soll.
quelle
@SpringBootTest
oder einer der Test-Slicing- Annotationen)Alle Antworten hier beziehen sich derzeit nur auf die Systemeigenschaften, die sich von den Umgebungsvariablen unterscheiden, deren Festlegung komplexer ist, insbesondere für Tests. Zum Glück kann die folgende Klasse dafür verwendet werden, und die Klassendokumente enthalten gute Beispiele
EnvironmentVariables.html
Ein kurzes Beispiel aus den Dokumenten, das für die Arbeit mit @SpringBootTest geändert wurde
quelle
Wenn Sie möchten, dass Ihre Variablen für alle Tests gültig sind, können Sie eine
application.properties
Datei in Ihrem Testressourcenverzeichnis haben (standardmäßig :),src/test/resources
die ungefähr so aussieht:Diese wird dann geladen und verwendet, es sei denn, Sie haben Definitionen über
@TestPropertySource
oder eine ähnliche Methode. Die genaue Reihenfolge, in der die Eigenschaften geladen werden, finden Sie in der Spring-Dokumentation, Kapitel 24. Externalisierte Konfiguration .quelle
Sie können die Systemeigenschaften als VM-Argumente festlegen.
Wenn Ihr Projekt ein Maven-Projekt ist, können Sie beim Ausführen der Testklasse den folgenden Befehl ausführen:
Testklasse:
Wenn Sie eine einzelne Testklasse oder -methode in Eclipse ausführen möchten, gehen Sie wie folgt vor:
1) Gehen Sie zu Ausführen -> Konfiguration ausführen
2) Wählen Sie auf der linken Seite Ihre Testklasse im Abschnitt Junit aus.
3) Gehen Sie wie folgt vor:
quelle
Bei Komponententests wird die Systemvariable noch nicht instanziiert, wenn ich "mvn clean install" durchführe, da auf keinem Server die Anwendung ausgeführt wird. Um die Systemeigenschaften festzulegen, muss ich dies in pom.xml tun. Wie so:
quelle