アプリケーションコンテキストを静的フィールドに設定するSpringコンポーネントがあります。この静的フィールドは、アプリケーションの他の部分からアクセスされます。私はstatic
を使用すべきではないと知っていますが、バネ管理されていないBeanからSpringコンテキストにアクセスする必要があることがあります。例えば。フィールドには、次のようになります。Spring静的コンテキストアクセッサと統合テスト
public class ApplicationContextProvider implements ApplicationContextAware {
private static ApplicationContext context;
public ApplicationContext getApplicationContext() {
return context;
}
@Override
public void setApplicationContext(ApplicationContext ctx) {
context = ctx;
}
}
問題は、統合テストフレームワークをJUnitのを使用して(またはスポック)とき、新しい春のコンテキストがのような注釈を持つテストのために作成されていることである(http://www.dcalabresi.com/blog/java/spring-context-static-class/のために撮影したもの) @TestPropertySource
または@ContextConfiguration
の場合、コンテキストは同じ設定(スプリングテストフレームワークのコンテキストキャッシング)で他のテスト用にキャッシュされます。
ただし、静的フィールドは、スプリングコンテキストが作成されたときにのみ更新されます。つまり、テストコンテキストがキャッシュから取得されると、コンテキストがキャッシュされる前に既に初期化されているため、静的フィールドは更新されません。静的フィールドは、前回のテスト実行で作成された最後のコンテキストによって異なる構成で上書きされていたため、テストを開始するコンテキストと同じコンテキストは表示されません。
結果は、テストの一部が1つのスプリングコンテキストで実行され、他のコンテキストで実行される静的フィールドにアクセスするポイントから実行されます。
誰にもこの問題の解決策がありますか?誰も同じ状況になった?