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