web-dev-qa-db-ja.com

JUnitランナー(Eclipse)のシステムプロパティを設定してSpring Webアプリをテストする

私たちのウェブアプリは、SystemPropertyPlaceholderを使用して、システムプロパティの値に応じてプロパティファイルを読み込みます(以下を参照)。

ローカルで実行するためのデフォルト設定はapplication.propertiesに保存されています。本番サーバーでは、アプリをデプロイする前に「env」を「本番」に設定するだけで、production.propertiesが読み込まれます。

アプリをテストするには、test.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に設定した別のコンテキストを使用するようにテストに指示できます...しかし、私のテストは私のコンテキストもカバーするため、可能な限り早期にエラーがキャッチされます(Webアプリ全体をロードするWebアプリ全体をロードするWebアプリで、エンドツーエンドのテストを行っています。私はそれを失いたくありません)。

これまでのところ、私が確認できる唯一の方法は、JUnitランナーを構成してシステムプロパティ設定引数を含めることですが、その方法はわかりません。

20
Pete

私は今、まったく同じ問題に取り組んでおり、うまくいけば方法を見つけました。テストケースの静的初期化子にSystem.setProperty()を呼び出すことができます。

40
AlexR

Eclipseで、JUnitテストクラスを右クリックし、[実行|構成を実行...]を選択して、[引数]タブに移動し、VM引数の下で、システムプロパティエントリに追加します。例:- Dcatalina.base = C:\ programs\Apache-Tomcat-7.0.32

20
bratan

あなたは depends-on Beanを呼び出すメソッドが他の前に実行されるようにする属性

0
bmichalik