使用YAML的Spring @PropertySource

25 浏览
0 Comments

使用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日
0
0 Comments

正如提到的那样,@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
  }
}

0
0 Comments

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()
        }
    }

到上下文中。

0