我最终找到了一种直接执行此操作的方法。它有点混乱,但实际上并不算太糟糕。
最初,测试是使用@ContextConfiguration 运行的,然后new TestContextManager(getClass()).prepareTestInstance(this);
在@Before 中进行初始化(单独初始化,因此我们可以使用Spring 之外的运行器)。
我将其扩展为首先注册一个文本执行侦听器,只要有一个可用的时候,它就会将 TestContext 抓取到测试本身中:
contextManager.registerTestExecutionListeners(new AbstractTestExecutionListener() {
@Override
public void prepareTestInstance(TestContext freshTestContext) throws Exception {
testContext = freshTestContext;
}
});
然后测试本身将一个属性注入到自定义的 PropertyPlaceholderConfigurer 中(非常简单:覆盖 resolvePlaceholder,调用 super.resolvePlaceholder,除非您之前明确设置了该属性),一旦它知道该属性的实际值是什么(不幸的是,直到实际测试) ,并调用:
testContext.markApplicationContextDirty();
contextManager.prepareTestInstance(this);
这使得 TestContext 重建应用程序上下文,现在使用新更改的属性值。
最后,您需要记住在测试之间重置属性,并可能将整个类标记为@DirtiesContext,以阻止它干扰您的其他测试。