在spring boot測試中無法加載配置文件中的值

項目中有變量是配置在application.yml文件裏面的,運行整個項目時沒有問題,但是單獨拿出來進行測試的話變量一直是空。

@Configuration
@ConfigurationProperties(prefix = "file")
@Data
public class CameraImageProperties {

    private String uploadDir;

    private String moveDir;
}

上面是讀取配置的類

file:
  upload-dir: D:/upload
  move-dir: D:/trade

上面是application.yml中相應的配置

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {CameraImageProperties.class},
        initializers = {ConfigFileApplicationContextInitializer.class})
public class ScheduledTasksTest {
	@Autowired
    private CameraImageProperties cameraImageProperties;
	
	@Test
    public void getUploadPath_thenCorrect() {
        String path = cameraImageProperties.getUploadDir();
        Assert.assertEquals("D:/upload", path);
    }
}

上面是測試類。

@ContextConfiguration中的classes方法是指運行集成測試時哪些類應該在ApplicationContext中,initializers方法是指定一個ApplicationContext初始化類,這裏因爲要用到配置文件,所以用ConfigFileApplicationContextInitializer類。
按理說沒問題啊,爲什麼測試不通過,測試方法裏面的path一直是空呢?

最後終於找到了解決方案:

@EnableAutoConfiguration
@ComponentScan(basePackageClasses = CameraImageProperties.class)
//@EnableConfigurationProperties(value = CameraImageProperties.class)
public class ScheduledTasksTestConfig {
}

這個類可以用上面的兩個註解,也可以用最下面的一個註解,原因我們後面再說。
有了上面的類,再修改ScheduledTasksTest如下:

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

現在測試就可以通過了。

原因

我們把配置文件中的值注入類中變量時,需要相應的bean來實現,最開始的時候,我們在ApplicationContext中只註冊了CameraImageProperties類,這個類的變量都是空的,沒有其他bean來把配置文件中的值注入它的變量。
我們加入ScheduledTasksTestConfig類後,spring boot把需要的bean加入了ApplicationContext,那些bean把配置文件中的值注入了CameraImageProperties中。

@EnableAutoConfiguration和@ComponentScan(basePackageClasses = CameraImageProperties.class)的作用是讓spring boot先找到CameraImageProperties類,然後根據類中的信息通過spring boot的自動配置功能判斷需要哪些bean。

@EnableConfigurationProperties(value = CameraImageProperties.class)的作用是直接告訴spring boot,我們需要ConfigurationProperties相關的bean,並且配置的類就是CameraImageProperties。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章