項目中有變量是配置在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。