web-dev-qa-db-fra.com

Les propriétés de démarrage du printemps dans 'application.yml' ne se chargent pas à partir de JUnit Test

Qu'est-ce que je fais mal? J'utilise cette petite application autonome qui fonctionne et trouve mon src/main/resources/config/application.yml. La même configuration ne fonctionne pas avec JUnit, voir ci-dessous:

@Configuration
@ComponentScan
@EnableConfigurationProperties

public class TestApplication {

    public static void main(String[] args) {

        SpringApplication.run(TestApplication.class);
    }
}


@Component
@ConfigurationProperties

public class Bean{
    ...
}

Ce qui suit ne fonctionne pas, les mêmes propriétés dans application.yml ne sont pas chargées et Bean a seulement les valeurs null:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = TestApplication.class)

public class SomeTestClass {
    ...
}
30
aliopi

Essaye ça:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestApplication.class, 
    initializers = ConfigFileApplicationContextInitializer.class)
public class SomeTestClass {
    ...
}

MODIFIER:

Pour la version de démarrage Spring 1.5+, SpringApplicationConfiguration a été supprimé en faveur de SpringBootTest ou de l'utilisation directe de SpringBootContextLoader

Vous pouvez toujours utiliser le paramètre initializers avec l'annotation ContextConfiguration.

35
luboskrnac

Voici un autre moyen: [Spring Boot v1.4.x]

@Configuration
@ConfigurationProperties(prefix = "own")
public class OwnSettings {

    private String name;
    Getter & setters...

}

import org.springframework.boot.test.context.SpringBootTestContextBootstrapper;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@BootstrapWith(SpringBootTestContextBootstrapper.class)
public class OwnSettingsTest {

  @Autowired
  private OwnSettings bean;

  @Test
  public void test() {
    bean.getName();
  }
}

Ceci fonctionne UNIQUEMENT s'il existe également un fichier 'application.properties'.

par exemple. projet maven:

src/main/resources/application.properties [ Le fichier peut être vide mais c'est obligatoire! ]
src/main/resources/application.yml [voici votre vrai fichier de configuration]

8
Juha Hanka

Alternative en février 2017:

@SpringBootTest
@ContextConfiguration(classes = { TestApplication.class })
@RunWith(SpringRunner.class)
public class SomeTestClass {
   ...
}

la variante lean (withouth @SpringBootTest):

@ContextConfiguration(classes = { TestApplication.class },
                 initializers = { ConfigFileApplicationContextInitializer.class })
@RunWith(SpringRunner.class)
public class SomeTestClass {
7
aliopi

L'astuce pour charger any un fichier yml personnalisé dans SpringBoot 2.0 sans @SpringBootTest

  • créer un fichier yml dans test\resources
  • Utiliser les propriétés ConfigFileApplicationContextInitializer et spring.config.location

Exemple de code:

@RunWith(SpringRunner.class)
@ContextConfiguration(
    classes = { MyConfiguration.class, AnotherDependancy.class },
    initializers = {ConfigFileApplicationContextInitializer.class} )
@TestPropertySource(properties = { "spring.config.location=classpath:myApp-test.yml" })
public class ConfigProviderTest {
    @Autowired
    private MyConfiguration myConfiguration; //this will be filled with myApp-test.yml 

   @Value("${my.config-yml-string}")
   private String someSrting; //will get value from the yml file.

}
6
Yarix

Exemple de botte de printemps 2:

private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
        .withInitializer(new ConfigFileApplicationContextInitializer());

@Test public void test() throws Exception {

    this.contextRunner
    .withUserConfiguration(TestApplication.class)
    .run((context) -> {

        .....

    });
}
0
Ritesh

Dans mon cas, j'essayais de tester une bibliothèque sans un @SpringBootApp déclaré dans le chemin d'accès aux classes standard, mais j'en ai un dans mon contexte de test. Après avoir débogué dans le processus d'initialisation Spring Boot, j'ai découvert que le fichier YamlPropertySourceLoader (à partir de la version 1.5.2.RELEASE) ne chargerait pas les propriétés YAML à moins que org.yaml.snakeyaml.Yaml se trouve sur le chemin d'accès aux classes. La solution pour moi était d’ajouter snakeyaml en tant que dépendance de test dans mon POM:

    <dependency>
        <groupId>org.yaml</groupId>
        <artifactId>snakeyaml</artifactId>
        <version>1.19</version>
        <scope>test</scope>
    </dependency>
0
Lyle