Remplacer les propriétés dans les tests de Spring

1. Vue d'ensemble

Dans ce didacticiel, nous examinerons différentes façons de remplacer les propriétés dans les tests de Spring.

Spring fournit en fait un certain nombre de solutions pour cela, nous avons donc beaucoup à explorer ici.

2. Dépendances

Bien sûr, pour travailler avec les tests Spring, nous devons ajouter une dépendance de test:

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

La dépendance spring-boot-starter-test contient tout ce dont nous avons besoin pour remplacer la valeur de la propriété dans les tests.

3. Configuration

Tout d'abord, nous devrons créer une classe dans l'application qui utilisera nos propriétés:

@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; } }

Ensuite, attribuons-leur des valeurs. Nous pouvons le faire en créant l' application.properties dans le src / main / resources:

example.firstProperty=defaultFirst example.secondProperty=defaultSecond

4. Remplacement d'un fichier de propriétés

Maintenant, nous allons remplacer les propriétés en plaçant le fichier de propriétés dans les ressources de test. Ce fichier doit être sur le même chemin de classe que celui par défaut.

En outre, il doit contenir toutes les clés de propriété spécifiées dans le fichier par défaut. Par conséquent, nous allons ajouter le fichier application.properties dans le src / test / resources :

example.firstProperty=file example.secondProperty=file

Ajoutons également le test qui utilisera notre solution:

@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); } }

Cette méthode est très efficace lorsque nous voulons remplacer plusieurs propriétés du fichier.

Et, si nous n'avons pas mis l' exemple.secondProperty dans le fichier, le contexte d'application ne découvrirait pas cette propriété.

5. Profils de ressort

Dans cette section, nous allons apprendre à résoudre notre problème à l'aide de Spring Profiles. Contrairement à la méthode précédente, celle-ci fusionne les propriétés du fichier par défaut et du fichier profilé .

Commençons par créer un fichier application - test.properties dans le src / test / resources:

example.firstProperty=profile

Après cela, nous allons créer un test qui utilisera le profil de 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); } }

Cette approche nous permet d'utiliser à la fois les valeurs par défaut et les valeurs de test. Par conséquent, c'est une excellente méthode lorsque nous devons remplacer plusieurs propriétés d'un fichier mais que nous voulons toujours utiliser celles par défaut .

De plus, nous pouvons en savoir plus sur les profils Spring dans notre didacticiel sur les profils Spring .

6. @SpringBootTest

Une autre façon de remplacer la valeur de la propriété consiste à utiliser l' annotation @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); } }

Comme on le voit, le example.firstProperty a été remplacé alors que le example.secondProperty n'a pas été . Par conséquent, c'est une excellente solution lorsque nous devons remplacer uniquement des propriétés spécifiques pour le test. C'est la seule méthode qui nécessite l'utilisation de Spring Boot.

7. TestPropertySourceUtils

Dans cette section, nous allons apprendre à remplacer des propriétés à l'aide de la classe TestPropertySourceUtils dans ApplicationContextInitializer.

Le TestPropertySourceUtils est livré avec deux méthodes que nous pouvons utiliser pour définir une valeur de propriété différente.

Créons une classe d'initialisation que nous utiliserons dans notre 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"); } }

Ensuite, nous ajouterons le fichier context-override-application.properties dans src / test / resources:

example.secondProperty=contextFile

Enfin, nous devons créer une classe de test qui utilisera notre initialiseur:

@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); } }

L' exemple.firstProperty a été remplacé par la méthode en ligne.

L' exemple.secondProperty a été remplacé par le fichier spécifique dans la deuxième méthode. Cette approche nous permet de définir différentes valeurs de propriété lors de l'initialisation du contexte.

8. Conclusion

Dans ce didacticiel, nous nous sommes concentrés sur les multiples façons que nous pouvons utiliser pour remplacer les propriétés dans nos tests.

Nous avons également découvert quand utiliser chaque solution ou, dans certains cas, quand les mélanger.

Bien entendu, nous avons également l' annotation @TestPropertySource à notre disposition.

Comme toujours, le code des exemples est disponible à l'adresse over sur GitHub.