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