在Spring Boot中直接在测试类和元注释上同时使用@TestPropertySource
时,两个属性源的属性不会合并,而只会合并在测试类上定义的属性礼物。
JUnit 5测试:
@CustomTest
@TestPropertySource(properties = "property.b=value-b")
class TestPropertySourceTests {
@Autowired
private Environment environment;
@Test
void testPropertiesFromTestPropertySourcesAreMergedFromTestAndMetaAnnotation() {
assertThat(environment.getProperty("property.a"), is(equalTo("value-a")));
assertThat(environment.getProperty("property.b"), is(equalTo("value-b")));
}
}
元注释:
@Retention(RUNTIME)
@ExtendWith(SpringExtension.class)
@SpringBootTest
@TestPropertySource(properties = "property.a=value-a")
@interface CustomTest {
}
测试失败,property.a
为null
,而不是value-a
,表明不存在通过元注释定义的属性。
如果两个@TestPropertySource
注释将处于类层次结构中(即TestPropertySourceTests
从BaseTests
扩展而来,则property.a
依次在其自己的{{1 }})
这是预期的(和记录的)行为吗?有人可能会争辩说,顺序仅在类层次结构中定义,而不是在注释树中定义,或在类层次结构和注释树之间定义。
答案 0 :(得分:0)
这是因为当Spring引导您的测试上下文时,它将仅搜索org.springframework.test.context.TestPropertySource
类型的本地声明的注释。
看看TestPropertySourceUtils
here
还可以查看here
MetaAnnotationUtils
if (AnnotationUtils.isAnnotationDeclaredLocally(annotationType, clazz)) {
return new AnnotationDescriptor<>(clazz, clazz.getAnnotation(annotationType));
}
当它们立即返回结果时,就没有机会同时使用声明的@CustomTest
注释来获取@TestPropertySource
注释。
所以目前不可能。
答案 1 :(得分:0)
这是春天设计的。 Sam Brannen在其他答案中证实了这一点:
我在Spring的跟踪器中打开了一个问题:https://github.com/spring-projects/spring-framework/issues/23299
如果仍需要此功能,请投票。