Overstyr eiendommer i vårens tester

1. Oversikt

I denne opplæringen vil vi se på forskjellige måter å overstyre egenskaper i Spring's tester.

Våren gir faktisk en rekke løsninger for dette, så vi har ganske mye å utforske her.

2. Avhengigheter

For å jobbe med vårprøver må vi selvfølgelig legge til en testavhengighet:

 org.springframework.boot spring-boot-starter-test 2.1.6.RELEASE test 

De vår-støvel-start-test avhengighet inneholder alt vi trenger for å overstyre eiendomsverdien i testene.

3. Oppsett

Først må vi lage en klasse i applikasjonen som vil bruke egenskapene våre:

@Component public class PropertySourceResolver {@Value ("$ {example.firstProperty}") privat streng firstProperty; @Value ("$ {example.secondProperty}") privat streng secondProperty; public String getFirstProperty () {return firstProperty; } public String getSecondProperty () {return secondProperty; }}

La oss deretter tildele verdier til dem. Vi kan gjøre det ved å lage application.properties i src / main / resources:

eksempel.firstProperty = standardFørste eksempel.secondProperty = defaultSecond

4. Overstyring av en eiendomsfil

Nå overstyrer vi egenskaper ved å sette eiendomsfilen i testressursene. Denne filen må værepå samme klassesti som standard.

I tillegg burde det inneholder alle eiendomsnøklene angitt i standardfilen. Derfor legger vi til application.properties filen inn i src / test / ressurser:

eksempel.firstProperty = fil eksempel.secondProperty = fil

La oss også legge til testen som vil gjøre bruk av løsningen vår:

@RunWith (SpringRunner.class) @SpringBootTest offentlig klasse TestResourcePropertySourceResolverIntegrationTest {@Autowired private PropertySourceResolver propertySourceResolver; @Test offentlig ugyldig shouldTestResourceFile_overridePropertyValues ​​() {String firstProperty = propertySourceResolver.getFirstProperty (); Streng secondProperty = propertySourceResolver.getSecondProperty (); assertEquals ("fil", firstProperty); assertEquals ("fil", secondProperty); }}

Denne metoden er veldig effektiv når vi vil overstyre flere egenskaper fra filen.

Og hvis vi ikke la eksempel.secondProperty i filen vil ikke applikasjonskonteksten oppdage denne egenskapen.

5. Vårprofiler

I denne delen lærer vi hvordan vi skal håndtere problemet vårt ved å bruke vårprofiler. I motsetning til den forrige metoden,denne smelter sammen egenskaper fra standardfilen og den profilerte filen.

La oss først lage en applikasjontest.egenskaper filen i src / test / ressurser:

eksempel.firstProperty = profil

Etter det oppretter vi en test som bruker test profil:

@RunWith (SpringRunner.class) @SpringBootTest @ActiveProfiles ("test") public class ProfilePropertySourceResolverIntegrationTest {@Autowired private PropertySourceResolver propertySourceResolver; @Test offentlig ugyldig skalProfiledProperty_overridePropertyValues ​​() {String firstProperty = propertySourceResolver.getFirstProperty (); Streng secondProperty = propertySourceResolver.getSecondProperty (); assertEquals ("profil", firstProperty); assertEquals ("defaultSecond", secondProperty); }}

Denne tilnærmingen lar oss bruke både standard- og testverdier. Derfor er dette en flott metode når vi trenger det overstyre flere egenskaper fra en fil, men vi vil fortsatt bruke standardverdien de.

I tillegg kan vi lære mer om vårprofiler i vår Vårprofiler opplæringen.

6. @SpringBootTest

En annen måte å overstyre eiendomsverdien på er å bruke @SpringBootTest kommentar:

@RunWith (SpringRunner.class) @SpringBootTest (egenskaper = {"eksempel.firstProperty = annotering"}) offentlig klasse SpringBootPropertySourceResolverIntegrationTest {@Autowired private PropertySourceResolver propertySourceResolver; @Test offentlig ugyldig shouldSpringBootTestAnnotation_overridePropertyValues ​​() {String firstProperty = propertySourceResolver.getFirstProperty (); Streng secondProperty = propertySourceResolver.getSecondProperty (); Assert.assertEquals ("kommentar", firstProperty); Assert.assertEquals ("defaultSecond", secondProperty); }}

Som vi kan se,de eksempel.firstProperty har blitt overstyrt mens eksempel.secondProperty har ikke vært. Derfor er dette en flott løsning når vi bare trenger å overstyre spesifikke egenskaper for testen. Dette er den eneste metoden som krever bruk av Spring Boot.

7. TestPropertySourceUtils

I denne delen lærer vi hvordan du overstyrer egenskaper ved å bruke TestPropertySourceUtils klasse i ApplicationContextInitializer.

De TestPropertySourceUtils kommer med to metoder som vi kan bruke til å definere en annen eiendomsverdi.

La oss lage en initialiseringsklasse som vi bruker i testen:

public class PropertyOverrideContextInitializer implementerer ApplicationContextInitializer {static final String PROPERTY_FIRST_VALUE = "contextClass"; @Override public void initialize (ConfigurableApplicationContext configurableApplicationContext) {TestPropertySourceUtils.addInlinedPropertiesToEnvironment (configurableApplicationContext, "example.firstProperty =" + PROPERTY_FIRST_VALUE); TestPropertySourceUtils.addPropertiesFilesToEnvironment (configurableApplicationContext, "context-override-application.properties"); }}

Deretter legger vi til context-override-application.properties fil inn i src / test / ressurser:

eksempel.secondProperty = contextFile

Til slutt bør vi lage en testklasse som vil bruke initialisereren vår:

@RunWith (SpringRunner.class) @ContextConfiguration (initializers = PropertyOverrideContextInitializer.class, classes = Application.class) public class ContextPropertySourceResolverIntegrationTest {@Autowired private PropertySourceResolver propertySourceResolver; @Test offentlig ugyldig skalContext_overridePropertyValues ​​() {final String firstProperty = propertySourceResolver.getFirstProperty (); final String secondProperty = propertySourceResolver.getSecondProperty (); assertEquals (PropertyOverrideContextInitializer.PROPERTY_FIRST_VALUE, firstProperty); assertEquals ("contextFile", secondProperty); }}

De eksempel.firstProperty har blitt overstyrt fra den innebygde metoden.

De eksempel.secondProperty har blitt overstyrt fra den spesifikke filen i den andre metoden. Denne tilnærmingen lar oss definere forskjellige eiendomsverdier når vi initialiserer konteksten.

8. Konklusjon

I denne opplæringen har vi fokusert på flere måter vi kan bruke til å overstyre egenskaper i testene våre.

Vi har også oppdaget når hver løsning skal brukes, eller i noen tilfeller når vi skal blande dem.

Vi har selvfølgelig @TestPropertySource kommentar til vår disposisjon også.

Som alltid er koden for eksempler tilgjengelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found