是否可以使用system-property作为@WebappConfiguration注释的值?我尝试过类似的东西:
@WebAppConfiguration("#{systemProperties['webapproot'] ?: 'war'}")
但它似乎根本不起作用。有没有其他方法可以通过春天这样做?我不希望通过我们的构建工具来实现这一点,因为它会破坏我们从IDE执行集成测试。
答案 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运行测试的能力,这很棒。