如何从 jUnit 测试启动 Maven 过滤?
Posted
技术标签:
【中文标题】如何从 jUnit 测试启动 Maven 过滤?【英文标题】:How to launch maven filtering from jUnit test? 【发布时间】:2011-12-15 00:51:33 【问题描述】:情况:我有一个 MyController 类,可以与一些外部 WebServices 一起使用。
public class MyController
private String integrationWebServiceURL;
此类 Web 服务 URL 在描述符(applicationContext.xml)中的配置控制器 bean 期间传递
<bean id="myController" class="com.mypath.MyController">
<property name="integrationWebServiceURL" value="$integration.web.service.url"/>
</bean>
值是动态的,实际值存储在属性文件application.properties
integration.web.service.url=$pom.integration.web.service.url
但这还没有结束——真正的值存储在 maven 项目文件 (pom.xml) 中,filtering=true。
<pom.integration.web.service.url>http://mywebservices.com</pom.integration.web.service.url>
因此,当我们使用 mvn install test 时,来自 pom.xml 的值被复制到 application.properties 中的适当占位符,然后我的类的测试就可以正常工作了。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="/applicationContext.xml")
public class MyControllerTest
问题:我需要从 IDE 启动我的测试,以便能够使用不同的设置并使用 IDE 的调试功能。但是,如果我在没有初步 Maven 构建的情况下从 IDE 简单地启动此测试,那么我的 Web 服务地址将简单地从 application.properties 获取并等于“$pom.integration.web.service.url”(例如,Maven 过滤过程不在测试之前不工作)。如何调整 Maven、Spring 或 jUnit 以从 pom.xml 中提取我的值?
注意:我知道我可以简单地在测试类使用的 application.properties 或 applicationContext.xml 文件中显式设置此值,但我需要从 pom.xml 中提取此值。
【问题讨论】:
如果你使用Eclipse,你试过M2Eclipse还是M2E插件? 为什么需要从 POM 中获取值?或者更确切地说,我真正的意思是,为什么 POM 是存储这些信息的合适位置?我建议将此类数据保存在可交付工件的 外部 属性文件中,并仅在运行时访问它。然后,您可以获得属性文件的一个版本,该版本仅在测试类路径中可用,特定于测试。 @Ralph IntelliJ IDEA 是我的 IDE。 @Andrew Spencer 这个值现在在 pom.xml 中。遗留代码,由另一位开发人员放置在这里 - 我认为这是有一些原因的。我没有机会改变它。 我认为这是一个 Maven + IntelliJ IDEA 问题。 【参考方案1】:只需用maven运行,如:
mvn test
然后一切都应该过滤 pom 变量。 您可以拥有特定属性文件的 testResources。或者一个 applicationContext-test.xml。
【讨论】:
我认为 OP 的需要是让测试在从 IDE 进行 clean+build(即非 Maven 构建)后工作。【参考方案2】:最好的解决方案是使用支持 Maven 并在必须构建源代码时运行 mvn copy-resources 的 IDE。对于 Eclipse,尝试m2e,对于 IDEA,Maven 插件也应该这样做。
如果由于某种原因这不是一个选项,您可以手动运行目标,例如在普通测试代码中的静态代码块中(因此它总是只执行一次):
static
Process p = Runtime.getRuntime().exec( "mvn copy-resources" );
IOUtils.copy( p.getInputStream(), System.out );
p.waitFor();
【讨论】:
以上是关于如何从 jUnit 测试启动 Maven 过滤?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 NetBeans Maven 项目中分析 JUnit 测试?