如何从 jUnit 测试启动 Maven 过滤?

发布于 2024-12-11 19:59:51 字数 1473 浏览 0 评论 0原文

情况:我有一个类 MyController,它可以与一些外部 Web 服务配合使用。

public class MyController {
    private String integrationWebServiceURL;
}

此类 Web 服务 URL 在配置控制器 bean 期间在描述符 (applicationContext.xml) 中传递。

<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 的调试功能。但是,如果我简单地从 IDE 启动此测试,而无需初步构建 Maven,那么我的 Web 服务地址将简单地从 application.properties 获取,并且等于“${pom.integration.web.service.url}”(例如,Maven 过滤过程不会测试前不起作用)。如何调整 Maven、Spring 或 jUnit 以从 pom.xml 中提取我的值?

注意:我知道我可以简单地在 Test-class 使用的 application.properties 或 applicationContext.xml 文件中显式设置此值,但我需要从 pom.xml 中提取此值。

Situation: I have a class MyController that works with some external WebServices.

public class MyController {
    private String integrationWebServiceURL;
}

This class web services URL is passed during configuration controller bean in descriptor(applicationContext.xml)

<bean id="myController"  class="com.mypath.MyController">
    <property name="integrationWebServiceURL" value="${integration.web.service.url}"/>
</bean>

The value is dynamic, actual value is stored in a properties file application.properties

integration.web.service.url=${pom.integration.web.service.url}

But it is not the end - the real value is stored in maven project file (pom.xml) with filtering=true.

<pom.integration.web.service.url>http://mywebservices.com</pom.integration.web.service.url>

So, when we use mvn install test values from pom.xml are copied to appropriate placeholders in application.properties and then tests of my class works just fine.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/applicationContext.xml"})
public class MyControllerTest {

}

Question: I need to launch my test from IDE to be able to play with different settings and to use IDE's debug feature. But if I simple launch this test from IDE without preliminary Maven build - than my web service address will be simply acquired from application.properties and equals "${pom.integration.web.service.url}" (e.g. process of Maven filtering doesn't work before test). How can I adjust Maven, Spring or jUnit to extract my value from pom.xml?

NOTE: I know that I can simple set this value explicitly in application.properties or applicationContext.xml files that used by Test-class, but I need extract this values from pom.xml.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

摘星┃星的人 2024-12-18 19:59:51

只需使用 maven 运行,如下所示:

mvn test

然后所有内容都应该与 pom 变量的过滤一起进行。
您可以拥有特定属性文件的 testResources。或者 applicationContext-test.xml。

Simply run with maven, as in:

mvn test

Then all should go with filtering of pom variables.
You can have testResources for specific properties files. Or an applicationContext-test.xml.

╰つ倒转 2024-12-18 19:59:51

最好的解决方案是使用 Maven 感知且运行 mvn copy-resources 当必须构建源时。对于 Eclipse,请尝试 m2e,对于 IDEA,Maven 插件也应该执行此操作。

如果由于某种原因这不是一个选项,您可以手动运行目标,例如在公共测试代码的静态代码块中(因此它总是只执行一次):

static {
    Process p = Runtime.getRuntime().exec( "mvn copy-resources" );
    IOUtils.copy( p.getInputStream(), System.out );
    p.waitFor();
}

The best solution is to use an IDE which is Maven-aware and which runs mvn copy-resources when the source has to be built. For Eclipse, try m2e, for IDEA, the Maven plugin should do this as well.

If that isn't an option for some reason, you can run the target manually, for example in a static code block in common test code (so it's always executed exactly once):

static {
    Process p = Runtime.getRuntime().exec( "mvn copy-resources" );
    IOUtils.copy( p.getInputStream(), System.out );
    p.waitFor();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文