Overschrijf eigenschappen in de tests van Spring

1. Overzicht

In deze zelfstudie bekijken we verschillende manieren om eigenschappen in de tests van Spring te overschrijven.

Spring biedt hier eigenlijk een aantal oplossingen voor, dus we hebben hier nogal wat te verkennen.

2. Afhankelijkheden

Om met Spring-tests te kunnen werken, moeten we natuurlijk een testafhankelijkheid toevoegen:

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

De spring-boot-starter-test afhankelijkheid bevat alles wat we nodig hebben om de eigenschapswaarde in de tests te overschrijven.

3. Installatie

Eerst moeten we een klasse in de applicatie maken die onze eigenschappen gebruikt:

@Component openbare klasse PropertySourceResolver {@Value ("$ {example.firstProperty}") private String firstProperty; @Value ("$ {example.secondProperty}") private String secondProperty; public String getFirstProperty () {return firstProperty; } public String getSecondProperty () {return secondProperty; }}

Laten we er vervolgens waarden aan toekennen. We kunnen dat doen door het application.properties in de src / main / resources:

example.firstProperty = defaultFirst example.secondProperty = defaultSecond

4. Een eigenschappenbestand overschrijven

Nu zullen we eigenschappen overschrijven door het eigenschappenbestand in de testresources te plaatsen. Dit bestand moetop hetzelfde klassenpad als standaard.

Bovendien zou het moeten bevatten alle eigenschapssleutels gespecificeerd in het standaardbestand. Daarom voegen we de application.properties bestand in het src / test / resources:

example.firstProperty = bestand example.secondProperty = bestand

Laten we ook de test toevoegen die gebruikmaakt van onze oplossing:

@RunWith (SpringRunner.class) @SpringBootTest openbare klasse TestResourcePropertySourceResolverIntegrationTest {@Autowired privé PropertySourceResolver propertySourceResolver; @Test openbare leegte shouldTestResourceFile_overridePropertyValues ​​() {String firstProperty = propertySourceResolver.getFirstProperty (); String secondProperty = propertySourceResolver.getSecondProperty (); assertEquals ("bestand", firstProperty); assertEquals ("bestand", secondProperty); }}

Deze methode is erg effectief als we meerdere eigenschappen uit het bestand willen overschrijven.

En als we de voorbeeld.secondProperty in het bestand, zou de toepassingscontext deze eigenschap niet ontdekken.

5. Veerprofielen

In dit gedeelte leren we hoe we met ons probleem om kunnen gaan door Spring Profiles te gebruiken. In tegenstelling tot de vorige methode,deze voegt eigenschappen van het standaardbestand en het geprofileerde bestand samen.

Laten we eerst een toepassingtest.properties bestand in het src / test / resources:

example.firstProperty = profiel

Daarna maken we een test die de test profiel:

@RunWith (SpringRunner.class) @SpringBootTest @ActiveProfiles ("test") openbare klasse ProfilePropertySourceResolverIntegrationTest {@Autowired privé PropertySourceResolver propertySourceResolver; @Test openbare leegte shouldProfiledProperty_overridePropertyValues ​​() {String firstProperty = propertySourceResolver.getFirstProperty (); String secondProperty = propertySourceResolver.getSecondProperty (); assertEquals ("profiel", firstProperty); assertEquals ("defaultSecond", secondProperty); }}

Deze benadering stelt ons in staat om zowel standaardwaarden als testwaarden te gebruiken. Daarom is dit een geweldige methode als dat nodig is meerdere eigenschappen van een bestand overschrijven, maar we willen toch de standaard gebruiken degenen.

Bovendien kunnen we meer te weten komen over Spring-profielen in onze Veerprofielen tutorial.

6. @BuienRadarNL

Een andere manier om de eigenschapswaarde te overschrijven, is door de @BuienRadarNL annotatie:

@RunWith (SpringRunner.class) @SpringBootTest (properties = {"example.firstProperty = annotatie"}) openbare klasse SpringBootPropertySourceResolverIntegrationTest {@Autowired private PropertySourceResolver propertySourceResolver; @Test openbare leegte shouldSpringBootTestAnnotation_overridePropertyValues ​​() {String firstProperty = propertySourceResolver.getFirstProperty (); String secondProperty = propertySourceResolver.getSecondProperty (); Assert.assertEquals ("annotatie", firstProperty); Assert.assertEquals ("defaultSecond", secondProperty); }}

Zoals we kunnen zien,de voorbeeld.firstProperty is overschreven terwijl de voorbeeld.secondProperty is niet geweest. Daarom is dit een geweldige oplossing wanneer we alleen specifieke eigenschappen voor de test moeten overschrijven. Dit is de enige methode waarvoor Spring Boot nodig is.

7. TestPropertySourceUtils

In deze sectie leren we hoe u eigenschappen kunt overschrijven met behulp van de TestPropertySourceUtils klasse in de ApplicationContextInitializer.

De TestPropertySourceUtils wordt geleverd met twee methoden die we kunnen gebruiken om een ​​andere eigenschapswaarde te definiëren.

Laten we een initialisatieklasse maken die we in onze test zullen gebruiken:

openbare klasse PropertyOverrideContextInitializer implementeert ApplicationContextInitializer {statische laatste 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"); }}

Vervolgens voegen we de context-override-application.properties bestand in src / test / resources:

example.secondProperty = contextFile

Ten slotte moeten we een testklasse maken die onze initialisatie gebruikt:

@RunWith (SpringRunner.class) @ContextConfiguration (initializers = PropertyOverrideContextInitializer.class, classes = Application.class) openbare klasse ContextPropertySourceResolverIntegrationTest {@Autowired privé PropertySourceResolver propertySourceResolver; @Test openbare leegte shouldContext_overridePropertyValues ​​() {laatste String firstProperty = propertySourceResolver.getFirstProperty (); laatste String secondProperty = propertySourceResolver.getSecondProperty (); assertEquals (PropertyOverrideContextInitializer.PROPERTY_FIRST_VALUE, firstProperty); assertEquals ("contextFile", secondProperty); }}

De voorbeeld.firstProperty is overschreven door de inline-methode.

De voorbeeld.secondProperty is overschreven door het specifieke bestand in de tweede methode. Deze benadering stelt ons in staat om verschillende eigenschapswaarden te definiëren bij het initialiseren van de context.

8. Conclusie

In deze zelfstudie hebben we ons gericht op de verschillende manieren waarop we eigenschappen in onze tests kunnen overschrijven.

We hebben ook ontdekt wanneer we elke oplossing moeten gebruiken of in sommige gevallen wanneer ze moeten worden gemengd.

We hebben natuurlijk de @TestPropertySource annotatie tot onze beschikking.

Zoals altijd is de code voor voorbeelden beschikbaar op GitHub.