GOOGLE ADS

jeudi 28 avril 2022

Remplir Spring @Value pendant le test unitaire

J'essaie d'écrire un test unitaire pour un haricot simple utilisé dans mon programme pour valider les formulaires. Le bean est annoté avec @Componentet a une variable de classe qui est initialisée en utilisant

@Value("${this.property.value}") private String thisProperty;

Je voudrais écrire des tests unitaires pour les méthodes de validation à l'intérieur de cette classe, cependant, si possible, je voudrais le faire sans utiliser le fichier de propriétés. Mon raisonnement derrière cela est que si la valeur que je tire du fichier de propriétés change, j'aimerais que cela n'affecte pas mon cas de test. Mon cas de test teste le code qui valide la valeur, pas la valeur elle-même.

Existe-t-il un moyen d'utiliser du code Java dans ma classe de test pour initialiser une classe Java et remplir la propriété Spring @Value dans cette classe, puis l'utiliser pour tester?

J'ai trouvé ce How To qui semble être proche, mais utilise toujours un fichier de propriétés. Je préférerais que tout soit du code Java.


Solution du problème

Depuis Spring 4.1, vous pouvez configurer des valeurs de propriété uniquement dans le code en utilisant org.springframework.test.context.TestPropertySourcedes annotations au niveau de la classe Unit Tests. Vous pouvez utiliser cette approche même pour injecter des propriétés dans des instances de bean dépendantes

Par example

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = FooTest.Config.class)
@TestPropertySource(properties = {
"some.bar.value=testValue",
})
public class FooTest {
@Value("${some.bar.value}")
String bar;
@Test
public void testValueSetup() {
assertEquals("testValue", bar);
}
@Configuration
static class Config {
@Bean
public static PropertySourcesPlaceholderConfigurer propertiesResolver() {
return new PropertySourcesPlaceholderConfigurer();
}
}
}

Remarque: Il est nécessaire d'avoir une instance de org.springframework.context.support.PropertySourcesPlaceholderConfigurerdans le contexte Spring

Edit 24-08-2017 : Si vous utilisez SpringBoot 1.4.0 et versions ultérieures, vous pouvez initialiser les tests avec @SpringBootTestet les @SpringBootConfigurationannotations. Plus d'infos ici

Dans le cas de SpringBoot, nous avons le code suivant

@SpringBootTest
@SpringBootConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
@TestPropertySource(properties = {
"some.bar.value=testValue",
})
public class FooTest {
@Value("${some.bar.value}")
String bar;
@Test
public void testValueSetup() {
assertEquals("testValue", bar);
}
}

Aucun commentaire:

Enregistrer un commentaire

Comment utiliseriez-vous .reduce() sur des arguments au lieu d'un tableau ou d'un objet spécifique ?

Je veux définir une fonction.flatten qui aplatit plusieurs éléments en un seul tableau. Je sais que ce qui suit n'est pas possible, mais...