无法从SpringBoot / JUnit正确加载application.yaml

时间:2019-07-14 08:46:11

标签: spring-boot junit spring-boot-test

我是SpringBoot的新手,正在尝试开发第一个应用程序。

我的应用程序具有application.yaml中提供的配置。当前,它在启动时成功读取其配置。

但是,如果我将应用程序嵌入Springboot / JUnit测试中,则application.yaml不会被正确利用。

  

我的印象是,使用Springboot / JUnit,application.yaml是   读起来就像是一个application.properties:它只接受   单行提供的参数(例如thread-pool: 10)   而不是多行

wordpress:
  themes:
    default-folder: /wp-content/themes/mkyong

我从我在github:XPath Operators & Functions的目录yaml-simple中找到的项目复制了同样的问题

应用程序成功读取其配置:

@SpringBootApplication
public class Application implements CommandLineRunner {

    @Autowired
    private WordpressProperties wpProperties;

    @Autowired
    private GlobalProperties globalProperties;

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... args) {
        System.out.println(globalProperties);
        System.out.println(wpProperties);
    }
}

但是如果我在目录中创建以下JUnit测试 src/test/java/com/mkyong

@RunWith(SpringRunner.class)
@TestPropertySource(locations="classpath:application.yml")
public class MyTest {

    @Autowired
    private WordpressProperties wpProperties;

    @Autowired
    private GlobalProperties globalProperties;


    @Test
    public void myTest() {
        Assert.assertTrue(globalProperties.getThreadPool() == 10); /// OK
        Assert.assertEquals("/wp-content/themes/mkyong", wpProperties.getThemes().getDefaultFolder()); // KO
    }

    @SpringBootApplication
    static class TestConfiguration {
    }

}

在运行它时,仅部分读取了配置!!!

(请注意,使用application.properties不会出现我的问题,但是我更喜欢使用Yaml来代替属性)

1 个答案:

答案 0 :(得分:0)

感谢user7294900的回答,我发现在测试类中添加注释@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class)可以解决问题:

@RunWith(SpringRunner.class)
@TestPropertySource(locations="classpath:application.yml")
@ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class)
public class MyTest {

    @Autowired
    private WordpressProperties wpProperties;

    @Autowired
    private GlobalProperties globalProperties;


    @Test
    public void myTest() {
        Assert.assertTrue(globalProperties.getThreadPool() == 10);
        Assert.assertEquals("/wp-content/themes/mkyong", wpProperties.getThemes().getDefaultFolder());
    }

    @SpringBootApplication
    static class TestConfiguration {
    }

}