为JUnit Runner(Eclipse)设置系统属性以测试SpringWebApp

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (73)

我们的Web应用程序使用SystemPropertyPlaceHolder根据系统属性的值加载属性文件

本地运行它的默认设置存储在application.properties。在生产服务器上,我们现在只是在部署应用程序之前将“env”设置为“产”,然后它将加载。production.properties

现在测试应用程序atest.properties应该使用文件。

如果我在Jenkins构建中运行所有测试,添加-Denv=test会像预期的那样工作。但是,如果我只想使用集成的JUnit运行程序在Eclipse中运行一个测试呢?

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = WebContextLoader.class, locations = {"classpath:application-context.xml" })
public class SomeTest {

有没有办法告诉我的测试应该在Spring加载之前将系统属性“env”设置为“test”?因为使用MethodInvokingFactoryBean将只在加载属性文件之前设置它,即使在加载属性文件之前设置它:

<bean id="systemPrereqs"
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject" value="#{@systemProperties}" />
    <property name="targetMethod" value="putAll" />
    <property name="arguments">
        <!-- The new Properties -->
        <util:properties>
            <prop key="env">test</prop>
        </util:properties>
    </property>
</bean>

<bean
    class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
    <property name="searchContextAttributes" value="true" />
    <property name="contextOverride" value="true" />
    <property name="ignoreResourceNotFound" value="true" />
    <property name="locations">
        <list>
            <value>classpath:application.properties</value>
            <value>classpath:${env}.properties</value>
            <value>${config}</value>
        </list>
    </property>
</bean>

<bean id="managerDataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="username">
        <value>${database.username}</value>
    </property>
    <property name="password">
        <value>${database.password}</value>
    </property>
    <property name="url">
        <value>${database.url}</value>
    </property>

</bean>

将数据库属性定义在application.properties、production.properties和test.properties中。

重点当然是,我想对所有环境使用相同的上下文文件,否则我可以告诉我的测试使用不同的上下文,其中我将PropertyPlaceHolder属性“Location”设置为test.properties...但我希望我的测试也涵盖我的上下文,以便尽早捕捉到那里的任何错误。

提问于
用户回答回答于

我现在正致力于解决同样的问题,希望能找到解决之道。你可以调用System.setProperty()进入测试用例的静态初始化程序。

用户回答回答于

在Eclipse中,右键单击JUnit测试类,选择Run As> Run Configurations ...,然后转到Arguments选项卡,并在VM Arguments下添加系统属性条目,例如-Dcatalina.base = C:\ programs \ Apache的Tomcat的7.0.32

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励