it-swarm.com.de

Überschreiben Sie die standardmäßigen Spring-Boot-Einstellungen für application.properties in Junit Test

Ich habe eine Spring-Boot-Anwendung, bei der die Standardeigenschaften in einer application.properties-Datei im Klassenpfad (src/main/resources/application.properties) festgelegt sind.

Ich möchte einige Standardeinstellungen in meinem JUnit-Test mit in einer test.properties-Datei deklarierten Eigenschaften überschreiben (src/test/resources/test.properties).

Ich habe normalerweise eine spezielle Config-Klasse 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 von @PropertySource("classpath:test.properties") in der TestConfig-Klasse den Trick ausführen würde, aber diese Eigenschaften überschreiben nicht die Einstellungen von application.properties (siehe Spring-Boot-Referenz Doc - 23. Externalized Configuration ).

Dann habe ich versucht, beim Aufruf des Tests -Dspring.config.location=classpath:test.properties 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 gelungen ist.

Es muss eine einfache Lösung geben, wie application.properties-Einstellungen in JUnit-Tests mit test.properties überschrieben werden kann, die ich übersehen habe.

124
FrVaBe

Sie können @TestPropertySource verwenden, um Werte in application.properties zu überschreiben. Aus seinem Javadoc:

testeigenschaftsquellen können zum selektiven Überschreiben von Eigenschaften verwendet werden, die in System- und Anwendungseigenschaftsquellen definiert sind

Zum Beispiel:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public class ExampleApplicationTests {

}
215
Andy Wilkinson

Sie können auch Meta-Annotationen verwenden, um die Konfiguration zu externalisieren. Zum Beispiel:

@RunWith(SpringJUnit4ClassRunner.class)
@DefaultTestAnnotations
public class ExampleApplicationTests { 
   ...
}

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SpringApplicationConfiguration(classes = ExampleApplication.class)
@TestPropertySource(locations="classpath:test.properties")
public @interface DefaultTestAnnotations { }
49
Rob Winch

Spring Boot lädt automatisch src/test/resources/application.properties, wenn die folgenden Anmerkungen verwendet werden

@RunWith(SpringRunner.class)
@SpringBootTest

Benennen Sie test.properties in application.properties um, um die automatische Konfiguration zu verwenden. 

Wenn Sie * only * die Eigenschaftendatei (in die Umgebung) laden müssen, können Sie auch Folgendes verwenden, wie dies hier erklärt ist.

@RunWith(SpringRunner.class)
@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class) 

[Update: Überschreiben bestimmter Eigenschaften zum Testen

  1. Fügen Sie src/main/resources/application-test.properties hinzu.
  2. Kommentieren Sie die Testklasse mit @ActiveProfiles("test").

Dadurch werden die application.properties- und dannapplication-test.properties-Eigenschaften in den Anwendungskontext für den Testfall gemäß den definierten Regeln hier geladen. 

Demo - https://github.com/mohnish82/so-spring-boot-testprops

37
Mohnish

Ein anderer Ansatz, der zum Überschreiben einiger Eigenschaften in Ihrem Test geeignet ist, wenn Sie die Annotation @SpringBootTest verwenden:

@SpringBootTest(properties = {"propA=valueA", "propB=valueB"})
6
NimaAJ

TLDR:

Was also getan wurde, war der Standard src/main/resources/application.properties und auch ein src/test/resources/application-default.properties, wo ich einige Einstellungen für ALLE meine Tests überschreibe.

Ganze Geschichte

Ich bin auf das gleiche 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 zu deklarieren - was leicht vergessen werden kann.

Der Trick besteht darin, zu nutzen, dass ein profilspezifisches 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

1
elonderin

Andernfalls ändern wir möglicherweise den Namen des Standardeigenschaftskonfigurators, legen die Eigenschaft spring.config.name=test fest und verfügen dann über eine Klassenpfadressource src/test/test.properties. Unsere native Instanz von org.springframework.boot.SpringApplication wird automatisch aus dieser separaten test.properties-Datei konfiguriert, wobei die Anwendungseigenschaften ignoriert werden.

Vorteil: Autokonfiguration von Tests;

Nachteil: Aufzeigen der Eigenschaft "spring.config.name" an C.I. Schicht

ref: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

spring.config.name = Name der Anwendung # Konfigurationsdatei

1
D. Soloviev

Sie können auch eine Datei application.properties in src/test/resources erstellen, in die Ihre JUnits geschrieben werden. 

0
PragmaticFire