使用 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}"
而 @WebAppConfiguration
的 value
只是 #{systemProperties.asd}
和 ${nonexistent_property}
初始化为简单的 String
。
不,不幸的是不支持。
提供给 @WebAppConfiguration
的 value
必须是显式资源路径,如 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 进行测试的能力,这很棒。
是否可以使用 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}"
而 @WebAppConfiguration
的 value
只是 #{systemProperties.asd}
和 ${nonexistent_property}
初始化为简单的 String
。
不,不幸的是不支持。
提供给 @WebAppConfiguration
的 value
必须是显式资源路径,如 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 进行测试的能力,这很棒。