Spring Boot:@TestPropertySource未从导入的配置加载
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
回答:
我昨天对其进行了调查,发现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
把它放在你的测试类。
以上是 Spring Boot:@TestPropertySource未从导入的配置加载 的全部内容, 来源链接: utcz.com/qa/427576.html