如何从 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 过滤?的主要内容,如果未能解决你的问题,请参考以下文章

如何在eclipse中通过Juit进行单元测试

如何在 NetBeans Maven 项目中分析 JUnit 测试?

如何使用 HSQLDB 内存数据库设置为 Maven 项目执行 Junit 测试套件?

如何使用 Java 启动和停止 Tomcat 容器?

从Eclipse中的Maven项目调试Junit测试

在Maven项目中运行JUnit 5测试用例