使用system-property作为@WebAppConfiguration的值

时间:2017-08-03 09:26:12

标签: java spring-mvc spring-test spring-test-mvc

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

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

但它似乎根本不起作用。有没有其他方法可以通过春天这样做?我不希望通过我们的构建工具来实现这一点,因为它会破坏我们从IDE执行集成测试。

3 个答案:

答案 0 :(得分:0)

@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}"@WebAppConfiguration value只有#{systemProperties.asd} ${nonexistent_property}String初始化为简单的Form2

答案 1 :(得分:0)

不,遗憾的是不支持。

提供给@WebAppConfiguration的{​​{1}}必须是显式资源路径,如类级别JavaDoc中所述。

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

此致

Sam( Spring TestContext Framework的作者

答案 2 :(得分:0)

我找到了解决这个问题的方法。我通过扩展ContextBootsTraper来编写自己的WebTestContextBootstrapper,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;
    }
}

然后可以将此类与@BootstrapWith - 注释:

一起使用
@RunWith(SpringJUnit4ClassRunner.class)
@BootstrapWith(SystemPropTestContextBootstrapper.class)
@WebAppConfiguration("standardDir")
public class SomeTest {

}

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