私が取り組んでいるプロジェクトには、独自のSpring Beanを定義する古い依存関係がいくつかありますが、メインアプリケーションから初期化する必要があります。これらの Bean はすべて、Spring プロファイルを使用して構築されます。つまり、プロダクション コードの場合は「default」、テスト コードの場合は「test」です。@import を使用してコンテキストを明示的に接続する代わりに、Spring プロファイルの使用をやめたいと考えています。
アイデアは、これらの古い依存関係をすべてカプセル化して、他のコンポーネントがスプリング プロファイルを気にする必要がないようにすることです。したがって、テストの観点から、アプリケーション コンテキストのセットアップは次のように記述できます。
@ContextConfiguration(classes = {TestContext.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class MyTest {
//tests
}
TestContext はさらに 2 つのクラスに指示します。そのうちの 1 つは古い依存関係をカプセル化します。
@Configuration
@Import(value = {OldComponents.class, NewComponents.class})
public class TestContext {
//common spring context
}
プロファイルに対する古いコンポーネントの必要性をカプセル化するために、OldComponents.class は次のようになります。
@Configuration
@Import(value = {OldContext1.class, OldContext2.class})
public class OldComponents {
static {
System.setProperty("spring.profiles.active", "test");
}
}
ここでの問題は、静的ブロックが時間内に実行されないように見えることです。mvn clean install を実行すると、ApplicationContext をロードできなかったため、テストで IllegalStateException が発生します。静的ブロックが実行されることを確認しましたが、この時点で (プロファイルに依存する) OldContext1 と OldContext2 が既に読み込まれているように見えます。つまり、手遅れです。
イライラするのは、IntelliJ がこの方法でテストをうまく実行することです。ただし、Maven はそうではありません。カプセル化したままこれらのプロファイルを強制する方法はありますか? 中間コンテキスト クラスを作成しようとしましたが、問題は解決しませんでした。
テスト クラスで注釈 @ActiveProfiles を使用すると、問題なく実行されますが、この種の目的は無効になります。当然、本番環境でも同じことを実現したいと考えています。これは、プロファイルの必要性をカプセル化できない場合、web.xml で構成する必要があることを意味します。