Sostituisci le proprietà nei test di primavera

1. Panoramica

In questo tutorial, daremo uno sguardo a vari modi per sovrascrivere le proprietà nei test di Spring.

La primavera in realtà fornisce una serie di soluzioni per questo, quindi abbiamo un bel po 'da esplorare qui.

2. Dipendenze

Ovviamente, per lavorare con i test di primavera, dobbiamo aggiungere una dipendenza di test:

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

La dipendenza spring-boot-starter-test contiene tutto ciò di cui abbiamo bisogno per sovrascrivere il valore della proprietà nei test.

3. Configurazione

Innanzitutto, dovremo creare una classe nell'applicazione che utilizzerà le nostre proprietà:

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

Successivamente, assegniamo loro dei valori. Possiamo farlo creando application.properties in src / main / resources:

example.firstProperty=defaultFirst example.secondProperty=defaultSecond

4. Sostituzione di un file delle proprietà

Ora sovrascriveremo le proprietà inserendo il file delle proprietà nelle risorse di test. Questo file deve essere sullo stesso percorso di classe di quello predefinito.

Inoltre, dovrebbe contenere tutte le chiavi di proprietà specificate nel file predefinito. Pertanto, aggiungeremo il file application.properties in src / test / resources :

example.firstProperty=file example.secondProperty=file

Aggiungiamo anche il test che utilizzerà la nostra soluzione:

@RunWith(SpringRunner.class) @SpringBootTest public class TestResourcePropertySourceResolverIntegrationTest { @Autowired private PropertySourceResolver propertySourceResolver; @Test public void shouldTestResourceFile_overridePropertyValues() { String firstProperty = propertySourceResolver.getFirstProperty(); String secondProperty = propertySourceResolver.getSecondProperty(); assertEquals("file", firstProperty); assertEquals("file", secondProperty); } }

Questo metodo è molto efficace quando vogliamo sovrascrivere più proprietà dal file.

E, se non mettessimo example.secondProperty nel file, il contesto dell'applicazione non scoprirebbe questa proprietà.

5. Profili a molla

In questa sezione, impareremo come affrontare il nostro problema utilizzando i profili Spring. A differenza del metodo precedente, questo unisce le proprietà del file predefinito e del file profilato .

Innanzitutto, creiamo un'applicazione - file test.properties in src / test / resources:

example.firstProperty=profile

Successivamente, creeremo un test che utilizzerà il profilo di test :

@RunWith(SpringRunner.class) @SpringBootTest @ActiveProfiles("test") public class ProfilePropertySourceResolverIntegrationTest { @Autowired private PropertySourceResolver propertySourceResolver; @Test public void shouldProfiledProperty_overridePropertyValues() { String firstProperty = propertySourceResolver.getFirstProperty(); String secondProperty = propertySourceResolver.getSecondProperty(); assertEquals("profile", firstProperty); assertEquals("defaultSecond", secondProperty); } }

Questo approccio ci consente di utilizzare sia i valori predefiniti che quelli di prova. Pertanto, questo è un ottimo metodo quando abbiamo bisogno di sovrascrivere più proprietà da un file ma vogliamo comunque utilizzare quelle predefinite .

Inoltre, possiamo saperne di più sui profili Spring nel nostro tutorial sui profili Spring .

6. @SpringBootTest

Un altro modo per sovrascrivere il valore della proprietà è utilizzare l' annotazione @SpringBootTest :

@RunWith(SpringRunner.class) @SpringBootTest(properties = { "example.firstProperty=annotation" }) public class SpringBootPropertySourceResolverIntegrationTest { @Autowired private PropertySourceResolver propertySourceResolver; @Test public void shouldSpringBootTestAnnotation_overridePropertyValues() { String firstProperty = propertySourceResolver.getFirstProperty(); String secondProperty = propertySourceResolver.getSecondProperty(); Assert.assertEquals("annotation", firstProperty); Assert.assertEquals("defaultSecond", secondProperty); } }

Come possiamo vedere, l'example.firstProperty è stato ignorato, mentre l'example.secondProperty non è stato . Pertanto, questa è un'ottima soluzione quando è necessario sovrascrivere solo proprietà specifiche per il test. Questo è l'unico metodo che richiede l'utilizzo di Spring Boot.

7. TestPropertySourceUtils

In questa sezione impareremo come sovrascrivere le proprietà usando la classe TestPropertySourceUtils in ApplicationContextInitializer.

The TestPropertySourceUtils comes with two methods that we can use to define a different property value.

Let's create an initializer class that we'll use in our test:

public class PropertyOverrideContextInitializer implements 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"); } }

Next, we'll add the context-override-application.properties file into src/test/resources:

example.secondProperty=contextFile

Finally, we should create a test class that will use our initializer:

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

The example.firstProperty has been overridden from the inlined method.

The example.secondProperty has been overridden from the specific file in the second method. This approach allows us to define different property values when initializing the context.

8. Conclusion

In this tutorial, we've focused on the multiple ways that we can use to override properties in our tests.

Abbiamo anche scoperto quando utilizzare ciascuna soluzione o in alcuni casi quando mescolarle.

Ovviamente abbiamo anche l' annotazione @TestPropertySource a nostra disposizione.

Come sempre, il codice per gli esempi è disponibile su GitHub.