一尘不染

Spring Boot:@TestPropertySource未从导入的配置加载

spring-boot

WebMvcTest我正在尝试使用Spring Boot 1.5.16
来加载test.properties应用@TestPropertySource注释,以便覆盖测试类中的某些属性。如果我将它放在测试类中,则效果很好:

@RunWith(SpringRunner.class)
@WebMvcTest
@TestPropertySource("classpath:test.properties")
public class ControllerTest {
    ...
}

但是如果我将其移至导入的配置,则不会加载属性:

@RunWith(SpringRunner.class)
@WebMvcTest
@Import(ControllersConfiguration.class)
public class ControllerTest {
    ...
}

ControllersConfiguration类是:

@TestConfiguration
@TestPropertySource("classpath:test.properties")
public class ControllersConfiguration {
    ...
}

您能解释一下这种行为吗?

PS @PropertySource注释在导入的配置中有效,但优先级低于application.properties

UPD:要明确-
尝试在此处通过所有测试:https :
//github.com/Javasick/WeirdTestPropertySource


阅读 748

收藏
2020-05-30

共1个答案

一尘不染

我昨天对其进行了调查,发现Spring @TestPropertySource仅在以下位置寻找此注释:

  • 源测试类
  • 接口是否由测试类实现
  • 此测试类别的超级赛
  • 继承的注释

AbstractTestContextBootstrapper.class是负责该代码的部分代码:

MergedTestPropertySources mergedTestPropertySources =
        TestPropertySourceUtils.buildMergedTestPropertySources(testClass);
MergedContextConfiguration mergedConfig = new MergedContextConfiguration(testClass,
        StringUtils.toStringArray(locations),
        ClassUtils.toClassArray(classes),
        ApplicationContextInitializerUtils.resolveInitializerClasses(configAttributesList),
        ActiveProfilesUtils.resolveActiveProfiles(testClass),
        mergedTestPropertySources.getLocations(),
        mergedTestPropertySources.getProperties(),
        contextCustomizers, contextLoader, cacheAwareContextLoaderDelegate, parentConfig);

该方法TestPropertySourceUtils.buildMergedTestPropertySources(testClass)完全负责从此批注中查找和提取位置。如您所见,Spring仅在测试类上调用它。

所以,如果你想这个外部化注释,你需要创建一个超类,并把这个注释,并@Import在其上,或与此注释创建界面,或者创建自己的注解,将结合两个注解@Import,并@TestPropertySource把它放在你的测试类。

2020-05-30