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 {
...
}
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
.
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]
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 {
L'astuce pour charger any un fichier yml personnalisé dans SpringBoot 2.0 sans @SpringBootTest
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.
}
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) -> {
.....
});
}
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>