Ich habe eine Spring-Boot-Anwendung, in der die Standardeigenschaften in einer application.properties
Datei im Klassenpfad festgelegt sind (src / main / resources / application.properties).
Ich möchte einige Standardeinstellungen in meinem JUnit-Test mit Eigenschaften überschreiben, die in einer test.properties
Datei deklariert sind (src / test / resources / test.properties).
Normalerweise habe ich eine spezielle Konfigurationsklasse für meine Junit-Tests, z
package foo.bar.test;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {
}
Ich dachte zuerst, dass die Verwendung @PropertySource("classpath:test.properties")
in der TestConfig-Klasse den Trick machen würde, aber diese Eigenschaften überschreiben die Einstellungen von application.properties nicht (siehe Spring-Boot-Referenzdokument - 23. Externalisierte Konfiguration ).
Dann habe ich versucht, -Dspring.config.location=classpath:test.properties
beim Aufrufen des Tests zu verwenden. Das war erfolgreich - aber ich möchte diese Systemeigenschaft nicht für jede Testausführung festlegen. Also habe ich es in den Code eingefügt
@Configuration
@Import(CoreConfig.class)
@EnableAutoConfiguration
public class TestConfig {
static {
System.setProperty("spring.config.location", "classpath:test.properties");
}
}
was leider wieder nicht erfolgreich war.
Es muss eine einfache Lösung geben, wie application.properties
Einstellungen in JUnit-Tests überschrieben werden können test.properties
, die ich übersehen haben muss.
quelle
Antworten:
Sie können
@TestPropertySource
Werte in überschreibenapplication.properties
. Aus seinem Javadoc:Beispielsweise:
quelle
@TestPropertySource
einproperties
Argument zum Überschreiben einiger Eigenschaften inline akzeptiert werden kann. Dies ist beispielsweise@TestPropertySource(properties = "myConf.myProp=valueInTest")
nützlich, wenn Sie keine brandneue Eigenschaftendatei möchten.@TestPropertySource(locations={"file:C:/dev/...","classpath:test.properties"})
@SpringApplicationConfiguration
bereits veraltet ist und Sie verwenden sollten@SpringBootTest
Spring Boot wird automatisch geladen
src/test/resources/application.properties
, wenn die folgenden Anmerkungen verwendet werdenBenennen Sie also
test.properties
umapplication.properties
, um die automatische Konfiguration zu verwenden.[ Update: Überschreiben bestimmter Eigenschaften zum Testen ]
src/main/resources/application-test.properties
.@ActiveProfiles("test")
.Dadurch werden die Eigenschaften für den Testfall gemäß den hier definierten Regeln geladen
application.properties
und anschließendapplication-test.properties
in den Anwendungskontext übernommen .Demo - https://github.com/mohnish82/so-spring-boot-testprops
quelle
application.properties
Dateien im Klassenpfad zu haben (eine insrc/main/resources
und eine insrc/test/resources
). Wer garantiert, dass beide genommen werden und welche zuerst genommen werden?application-test.properties
im Testfall das aktive Profil hinzufügensrc/main/resources
und angebentest
.src/test/resources/application.properties
werden während der Testphase geladen undsrc/main/resources/application.properties
ignoriert.application-default.properties
und sie werden berücksichtigt, da Sie automatisch das "Standard" -Profil ausführen (falls nicht anders angegeben).Sie können auch Meta-Annotationen verwenden, um die Konfiguration zu externalisieren. Beispielsweise:
quelle
Ein weiterer Ansatz, der zum Überschreiben einiger Eigenschaften in Ihrem Test geeignet ist, wenn Sie
@SpringBootTest
Anmerkungen verwenden:quelle
SpringBootTest
laden Sie die Datei application.properties?TLDR:
Also habe ich den Standard
src/main/resources/application.properties
und auch einen,src/test/resources/application-default.properties
bei dem ich einige Einstellungen für ALLE meine Tests überschreibe.Ganze Geschichte
Ich bin auf dasselbe Problem gestoßen und habe bisher auch keine Profile verwendet. Es schien lästig zu sein, es jetzt tun zu müssen und sich daran zu erinnern, das Profil deklariert zu haben - was leicht vergessen werden kann.
Der Trick besteht darin, zu nutzen, dass ein Profil bestimmte
application-<profile>.properties
Einstellungen im allgemeinen Profil überschreibt. Siehe https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties .quelle
Einfache Erklärung:
Wenn Sie wie ich sind und dasselbe
application.properties
insrc/main/resources
undsrc/test/resources
haben und sich fragen, warum dasapplication.properties
in Ihrem Testordner dasapplication.properties
in Ihren Hauptressourcen nicht überschreibt , lesen Sie weiter ...Ob Sie
application.properties
untersrc/main/resources
und dasselbeapplication.properties
unter habensrc/test/resources
, wasapplication.properties
abgeholt wird, hängt davon ab, wie Sie Ihre Tests durchführen . Die Ordnerstruktursrc/main/resources
undsrc/test/resources
ist ein Maven architektonische Konvention, also wenn Sie wie Ihr Test ausführenmvnw test
oder sogargradlew test
, dieapplication.properties
insrc/test/resources
wird abgeholt, als Test Classpath vorangehen Haupt Classpath. Aber, wenn Sie Ihren Test wie laufenRun as JUnit Test
in Elipse / STS, dieapplication.properties
insrc/main/resources
wird abgeholt, als Haupt- Classpath vorangeht Test Classpath.Sie können es überprüfen, indem Sie das öffnen
Run > Run Configurations > JUnit > *your_run_configuration* > Click on "Show Command Line"
.Sie werden so etwas sehen wie:
Sehen Sie, dass \ main zuerst kommt und dann \ test ? Richtig, es geht nur um Klassenpfad :-)
Prost
quelle
quelle
Wenn Sie Spring 5.2.5 und Spring Boot 2.2.6 verwenden und nur einige Eigenschaften anstelle der gesamten Datei überschreiben möchten. Sie können die neue Anmerkung verwenden: @DynamicPropertySource
quelle
Andernfalls ändern wir möglicherweise den Standardnamen des Eigenschaftenkonfigurators, legen die Eigenschaft fest
spring.config.name=test
und verfügen dann über eine Klassenpfadressource, derensrc/test/test.properties
native Instanzorg.springframework.boot.SpringApplication
automatisch aus dieser getrennten test.properties konfiguriert wird, wobei Anwendungseigenschaften ignoriert werden.Vorteil: automatische Konfiguration von Tests;
Nachteil: Offenlegen der Eigenschaft "spring.config.name" auf der CI-Ebene
Ref: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
quelle
application.properties
ist für mich keine Option, da ich nur einige der ursprünglichen Konfigurationswerte im Test überschreiben möchte .Sie können auch eine application.properties-Datei in src / test / resources erstellen, in die Ihre JUnits geschrieben sind.
quelle