使用YAML的Spring @PropertySource
使用YAML的Spring @PropertySource
Spring Boot允许我们使用YAML文件替换我们的application.properties
文件。但是,在我的测试中似乎遇到了一些问题。如果我注释我的TestConfiguration
(一个简单的Java配置文件),它会期望一个属性文件。
例如,这样不起作用:@PropertySource(value =“classpath:application-test.yml”)
如果我在YAML文件中有这个:
db: url: jdbc:oracle:thin:@pathToMyDb username: someUser password: fakePassword
我会用类似这样的东西利用这些值:
@Value("${db.username}") String username
但是,我最终得到一个错误,就像这样:
Could not resolve placeholder 'db.username' in string value "${db.username}"
我如何在我的测试中利用YAML的好处呢?
admin 更改状态以发布 2023年5月23日
正如提到的那样,@PropertySource
不能加载yaml文件。作为解决方法,手动加载文件并将加载的属性添加到Environment
中。
实现 ApplicationContextInitializer
:
public class YamlFileApplicationContextInitializer implements ApplicationContextInitializer{ @Override public void initialize(ConfigurableApplicationContext applicationContext) { try { Resource resource = applicationContext.getResource("classpath:file.yml"); YamlPropertySourceLoader sourceLoader = new YamlPropertySourceLoader(); PropertySource> yamlTestProperties = sourceLoader.load("yamlTestProperties", resource, null); applicationContext.getEnvironment().getPropertySources().addFirst(yamlTestProperties); } catch (IOException e) { throw new RuntimeException(e); } } }
将您的初始化程序添加到测试中:
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = Application.class, initializers = YamlFileApplicationContextInitializer.class) public class SimpleTest { @Test public test(){ // test your properties } }
Spring-boot有一个辅助工具,只需在测试类或抽象测试超类的顶部添加
@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class)
即可。
编辑:我在五年前写下了这个答案。它在最近的Spring Boot版本中无法工作。这是我现在的做法(如果需要,请将Kotlin翻译为Java):
在顶部添加
@TestPropertySource(locations=["classpath:application.yml"]) @ContextConfiguration( initializers=[ConfigFileApplicationContextInitializer::class] )
,然后添加
@Configuration open class TestConfig { @Bean open fun propertiesResolver(): PropertySourcesPlaceholderConfigurer { return PropertySourcesPlaceholderConfigurer() } }
到上下文中。