‘application.yml’中的Spring Boot属性未从JUnit Test加载

我究竟做错了什么? 我正在使用这个小的独立应用程序运行并找到我的src/main/resources/config/application.yml 。 相同的配置在JUnit中不起作用,见下文:

 @Configuration @ComponentScan @EnableConfigurationProperties public class TestApplication { public static void main(String[] args) { SpringApplication.run(TestApplication.class); } } @Component @ConfigurationProperties public class Bean{ ... } 

以下不起作用, application.yml中的相同属性未加载, Bean只有null值:

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

尝试这个:

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

编辑

对于Spring Boot 1.5+版, SpringApplicationConfiguration被删除,转而使用SpringBootTest或直接使用SpringBootContextLoader

您仍然可以将initializers参数与ContextConfiguration批注一起使用。

这是另一种方式:[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(); } } 

仅当“application.properties”文件存在时,此方法才有效。

例如maven项目:

src / main / resources / application.properties [ 该文件可以为空,但它是必需的! ]
src / main / resources / application.yml [这是你的真实配置文件]

2017年2月替代方案:

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

精益变种(没有@SpringBootTest ):

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

使用@SpringBootTest在SpringBoot 2.0中加载任何自定义yml文件的@SpringBootTest

  • 在test \ resources中创建一些yml文件
  • 使用ConfigFileApplicationContextInitializerspring.config.location属性

示例代码:

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

在我的情况下,我试图测试一个没有在常规应用程序类路径中声明的@SpringBootApp的库,但我在测试上下文中确实有一个。 在通过Spring Boot初始化过程调试之后,我发现Spring Boot的YamlPropertySourceLoader (从1.5.2.RELEASE开始)将不会加载YAML属性,除非org.yaml.snakeyaml.Yaml在类路径上。 我的解决方案是在我的POM中添加snakeyaml作为测试依赖项:

   org.yaml snakeyaml 1.19 test  

Spring boot 2示例:

 private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withInitializer(new ConfigFileApplicationContextInitializer()); @Test public void test() throws Exception { this.contextRunner .withUserConfiguration(TestApplication.class) .run((context) -> { ..... }); } 

这很有效

 import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class ApplicationTest { @Test public void contextLoads() { } }