J'ai un projet de démarrage de printemps et cela fonctionne très bien. Je souhaite maintenant écrire des tests pour mon application et je rencontre des problèmes de configuration.
Spring Boot a créé une classe de test pour moi appelée ApplicationTests. C'est très simple et ça ressemble à ça:
@RunWith(SpringRunner.class)
@SpringBootTest
public class DuurzaamApplicationTests {
@Test
public void contextLoads() {
}
}
Maintenant, quand je commence les tests, j'obtiens cette erreur:
Java.lang.IllegalArgumentException: Could not resolve placeholder 'company.upload' in value "${company.upload}"
J'ai un fichier properties.yml dans le répertoire src/test/resources et, pour une raison quelconque, il n'est pas chargé. J'ai essayé toutes sortes d'annotations à partir d'exemples sur Internet et pourtant aucune d'entre elles ne fonctionne.
Comment puis-je dire aux tests de démarrage printanier d'utiliser un fichier application.yml pour charger les propriétés?
nous pouvons utiliser @TestPropertySource
ou @PropertySource
pour charger le fichier de propriétés
@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource("classpath:properties.yml")
@ActiveProfiles("test")
public class DuurzaamApplicationTests {
@Test
public void contextLoads() {
}
}
À ma grande surprise, lorsque vous chargez des fichiers de propriétés dans Spring Boot Test, .yml
n'est pas pris en charge. C'est noté dans la documentation, bien qu'implicitement.
À partir du lien ci-dessus:
Formats de fichiers pris en charge
Les formats de fichier de propriétés traditionnels et XML sont pris en charge - par exemple, "classpath: /com/example/test.properties" ou "file: /path/to/file.xml".
.yml
n'est pas mentionné.
Et, après avoir changé mon .yml
en .properties
et avoir réécrit les valeurs sous la forme xx.xx.xx=value
, les paires clé-valeur peuvent être lues correctement.
Si étrange.
@PropertySource
et @TestPropertySource
ne fonctionnent pas avec YAML. Voir this .
Je l'ai aussi testé moi-même. Essayez de créer 2 fichiers - * .yml et * .properties et voyez-le par vous-même.
Pour que *.yml
fonctionne, la plupart des gens utilisent @SpringBootTest
, mais si ce n'est pas ce que vous voulez et si vous préférez utiliser @ContextConfiguration
, vous serez un peu surpris.
Pour moi, les solutions ci-dessus ne fonctionnaient pas et les variables d'environnement remplaçaient toujours les propriétés de test définies dans @TestPropertySource, même si https://docs.spring.io/spring-boot/docs/current/reference/html/boot -features-external-config.html indique que cette source doit avoir une priorité supérieure à celle des variables d'environnement. La seule solution qui a fonctionné pour moi a été de définir manuellement un bean PropertyPlaceholderConfigurer
dans une classe de configuration de test et de le définir avec la priorité la plus élevée.
C'était avec Spring Boot 1.5.15.RELEASE
@Configuration
@TestPropertySource(properties = "/application-test.properties")
@Slf4j
public class IntegrationTestConfiguration {
@Bean
public static PropertyPlaceholderConfigurer properties() {
PropertyPlaceholderConfigurer ppc
= new PropertyPlaceholderConfigurer();
Resource[] resources = new ClassPathResource[]
{ new ClassPathResource( "/application-test.properties" ) };
ppc.setLocations( resources );
ppc.setIgnoreUnresolvablePlaceholders( true );
ppc.setOrder( Ordered.HIGHEST_PRECEDENCE );
return ppc;
}
/// ....
@RunWith( SpringRunner.class )
@ActiveProfiles( "test" )
@Import( IntegrationTestConfiguration.class )
@SpringBootTest( webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT )
public class MyTest {