21

この 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 アプリ全体をロードしてそこにいくつかの素晴らしいフィードバックを提供する spring-web-mvc を使用して、Web アプリでエンド ツー エンドのテストを行っています。私はそれを失いたくありません)。

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

4

3 に答える 3

45

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

于 2012-06-12T13:07:06.547 に答える
19

Eclipse で JUnit テスト クラスを右クリックし、[Run As] > [Run Configurations...] を選択して [Arguments] タブに移動し、[VM Arguments] の下にシステム プロパティ エントリを追加します (例: -Dcatalina.base=C:\programs\)。 Apache-Tomcat-7.0.32

于 2012-12-04T05:18:47.470 に答える
0

属性を使用depends-onして、Bean を呼び出すメソッドを他のメソッドの前に実行することができます。

于 2015-02-19T08:22:56.940 に答える