为JUnit Runner(Eclipse)设置系统属性以测试Spring Web App

Pet*_*ete 20 java eclipse junit spring system-properties

我们的Web应用程序使用SystemPropertyPlaceholder根据系统属性的值加载属性文件(参见下文)

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

现在,为了测试应用程序,test.properties应该使用一个文件.

如果我在我们的jenkins构建中运行所有测试,则添加-Denv=test将按预期工作.但是,如果我只想在Eclipse中使用集成的JUnit运行器运行单个测试呢?

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

有没有办法告诉我的测试它应该在Spring加载之前将系统属性"env"设置为"test"?因为using 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>
Run Code Online (Sandbox Code Playgroud)

使用application.properties,production.properties和test.properties中定义的数据库属性.

关键是,我想对所有环境使用相同的上下文文件,否则我可以告诉我的测试使用不同的上下文,我将PropertyPlaceholder属性"location"设置为test.properties ...但我想要我的测试也涵盖了我的上下文,以便尽可能早地捕获任何错误(我正在使用spring-web-mvc在我们的网络应用程序上进行端到端测试,这会加载整个网络应用程序,提供一些很好的反馈,我不想放松那个).

到目前为止,我能看到的唯一方法可能是配置JUnit运行器以包含一些系统属性设置参数,但我不知道如何做到这一点.

Ale*_*exR 41

我现在正在研究完全相同的问题,希望找到方法.您可以调用System.setProperty()测试用例的静态初始值设定项.

  • 虽然这在运行单个测试时会起作用,但在运行多个测试时可能不一定有效,因为Spring上下文可能会在多个测试中重复使用. (3认同)

bra*_*tan 19

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

  • 默认情况下,是否有任何方法可以对所有测试执行此操作,因此您不必为每个测试手动设置此属性? (7认同)