在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。

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