私たちのウェブアプリは、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ランナーを構成してシステムプロパティ設定引数を含めることですが、その方法はわかりません。
私は今、まったく同じ問題に取り組んでおり、うまくいけば方法を見つけました。テストケースの静的初期化子にSystem.setProperty()
を呼び出すことができます。
Eclipseで、JUnitテストクラスを右クリックし、[実行|構成を実行...]を選択して、[引数]タブに移動し、VM引数の下で、システムプロパティエントリに追加します。例:- Dcatalina.base = C:\ programs\Apache-Tomcat-7.0.32
あなたは depends-on
Beanを呼び出すメソッドが他の前に実行されるようにする属性