将属性添加到属性占位符

Ral*_*lph 5 java spring unit-testing properties

我有一个应用程序,其中使用属性占位符来读取属性,配置在applicationContext.xml:

...
<context:property-placeholder
     location="classpath*:META-INF/spring/*.properties"/> 
...
Run Code Online (Sandbox Code Playgroud)

应用程序在Tomcat中运行,并使用context.xml中定义的参数.应用程序像普通属性(@Value(${cfma.applicationUrl}))一样访问此参数.这有效

在我的测试用例中,我没有这个tomcat属性,所以我想将它们"手动"添加到应用程序上下文中.但也加载正常applicationContext.xml

testContext.xml:

<import resource="classpath:/META-INF/spring/applicationContext.xml" />
<context:property-placeholder properties-ref="simulatedTomcatProperties"/>
<util:properties id="simulatedTomcatProperties">
   <prop key="cfmt.applicationBaseUrl">localhost:8080/cfmt</prop>
</util:properties>
Run Code Online (Sandbox Code Playgroud)

现在我有两个上下文:属性占位符,这不起作用(当然) - 所以我的问题是,我可以在测试中的"普通"属性占位符中扩展属性?


更多我需要的解释:

  • 生产环境(以及开发环境)通过Tomcat参数定义一些属性.因此它们不包含在任何属性文件中,但它们可以像普通属性一样无神经地访问(@Value(${cfma.applicationUrl})).而且一定不能有任何Fallback,如果Tomcat中没有定义属性,应用程序一定不能启动!
  • 在测试用例(使用spring上下文)中,我必须介绍如何插入属性(cfma.applicationUrl),以便可以将其注入带注释的变量中.但如果我添加一秒context:property-placeholder他们没有合并:

@参见https://jira.springsource.org/browse/SPR-4881上的评论- 他们解释了这种行为.


当我谈论Tomcat参数时,我正在谈论这样的一些想法:

context.xml中:

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Parameter name="cfmt.applicationBaseUrl"
          value="http://localhost/demoApp" override="false"/>
</Context>
Run Code Online (Sandbox Code Playgroud)

Dun*_*gor 5

不确定这是否有帮助,但我在类似的情况下做的是有2个app.properties文件具有相同的名称,一个在sec/test/resources中,另一个在src/main/resources中.现在在测试期间第一个被加载,因为测试类首先在类路径上,但是当我部署时只有主要的那个在那里,所以它被加载.