web-dev-qa-db-fra.com

Tests d'amorçage Spring - Impossible de trouver les propriétés de test

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?

11
Martijn Hiemstra

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() {
    }    
}

Documents: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/TestPropertySource.html

9
Barath

À 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:

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/TestPropertySource.html

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.

3
WesternGun

@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.

1
yuranos87

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 {
0
GameSalutes