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

回到顶部