‘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文件
- 使用
ConfigFileApplicationContextInitializer
和spring.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() { } }