WebMvcTest我正在尝试使用Spring Boot 1.5.16 来加载test.properties应用@TestPropertySource注释,以便覆盖测试类中的某些属性。如果我将它放在测试类中,则效果很好:
WebMvcTest
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类是:
ControllersConfiguration
@TestConfiguration @TestPropertySource("classpath:test.properties") public class ControllersConfiguration { ... }
您能解释一下这种行为吗?
PS @PropertySource注释在导入的配置中有效,但优先级低于application.properties
@PropertySource
application.properties
UPD:要明确- 尝试在此处通过所有测试:https : //github.com/Javasick/WeirdTestPropertySource
我昨天对其进行了调查,发现Spring @TestPropertySource仅在以下位置寻找此注释:
这AbstractTestContextBootstrapper.class是负责该代码的部分代码:
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仅在测试类上调用它。
TestPropertySourceUtils.buildMergedTestPropertySources(testClass)
所以,如果你想这个外部化注释,你需要创建一个超类,并把这个注释,并@Import在其上,或与此注释创建界面,或者创建自己的注解,将结合两个注解@Import,并@TestPropertySource把它放在你的测试类。
@Import