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 applikasjon–test.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.