簡體   English   中英

為JUnit Runner(Eclipse)設置系統屬性以測試Spring Web App

[英]Set System Property for JUnit Runner (Eclipse) to test a Spring Web App

我們的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 {

有沒有辦法告訴我的測試它應該在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 ...但我想要我的測試也涵蓋了我的上下文,以便盡可能早地捕獲任何錯誤(我正在使用spring-web-mvc在我們的網絡應用程序上進行端到端測試,這會加載整個網絡應用程序,提供一些很好的反饋,我不想放松那個)。

到目前為止,我能看到的唯一方法可能是配置JUnit運行器以包含一些系統屬性設置參數,但我不知道如何做到這一點。

我現在正在研究完全相同的問題,並希望找到方法。 您可以將System.setProperty()調用到測試用例的靜態初始化程序中。

在Eclipse中,右鍵單擊JUnit測試類,選擇Run As> Run Configurations ...,然后轉到Arguments選項卡,在VM Arguments下,添加系統屬性條目,例如-Dcatalina.base = C:\\ programs \\ Apache的Tomcat的7.0.32

您可以嘗試使用depends-on屬性讓方法在其他人之前調用bean

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM