使用 system-属性 作为 @WebAppConfiguration 的值

Use system-property as the value of @WebAppConfiguration

是否可以使用 system-属性 作为 @WebappConfiguration 注释的值?我试过类似的东西:

@WebAppConfiguration("#{systemProperties['webapproot'] ?: 'war'}")

但是好像一点用都没有。有没有其他方法可以通过 spring 做到这一点?我不想通过我们的构建工具来执行此操作,因为它会中断从我们的 IDE 执行集成测试。

@WebAppConfiguration 似乎既不支持 SpEL 也不支持占位符解析。

我按以下方式检查:我尝试注入系统 属性 并使用 @Value 解析占位符。当我试图注入一个不存在的 属性 @Value 失败时,分别抛出 SpelEvaluationException: EL1008E: Property or field 'asd' cannot be found on object of type 'java.util.Properties'IllegalArgumentException: Could not resolve placeholder 'nonexistent_property' in value "${nonexistent_property}"@WebAppConfigurationvalue 只是 #{systemProperties.asd}${nonexistent_property} 初始化为简单的 String

不,不幸的是不支持。

提供给 @WebAppConfigurationvalue 必须是显式资源路径,如 class 级 JavaDoc 中所述。

如果您希望我们考虑对 value 属性进行动态评估,请随时打开 JIRA issue 请求此类支持。

此致,

Sam(Spring TestContext Framework 的作者)

我找到了解决这个问题的方法。我通过扩展 WebTestContextBootstrapper 来编写自己的 ContextBootsTraper,Spring 用于加载 WebAppConfiguration-注释值。

我扩展了功能以包括检查某个系统是否存在 - 属性 并在存在时覆盖注释值:

 public class SystemPropTestContextBootstrapper extends WebTestContextBootstrapper {

    @Override
    protected MergedContextConfiguration processMergedContextConfiguration(MergedContextConfiguration mergedConfig) {
        WebAppConfiguration webAppConfiguration = AnnotationUtils.findAnnotation(mergedConfig.getTestClass(),
                WebAppConfiguration.class);
        if (webAppConfiguration != null) {
            //implementation ommited
            String webappDir = loadWebappDirFromSystemProperty();
            if(webappDir == null) {
                webappDir = webAppConfiguration.value();
            }
            return new WebMergedContextConfiguration(mergedConfig, webappDir);
        }

        return mergedConfig;
    }
}

此 class 然后可以与 @BootstrapWith-注释一起使用:

@RunWith(SpringJUnit4ClassRunner.class)
@BootstrapWith(SystemPropTestContextBootstrapper.class)
@WebAppConfiguration("standardDir")
public class SomeTest {

}

此解决方案使我能够 运行 从我的构建工具进行测试,同时保持 运行 从我的 IDE 进行测试的能力,这很棒。