外部検索エンジンをモックするために使用する applicationContext-test.xml に Bean があります。このようにして、テストを実行するとき、アプリケーション コードがこの検索エンジンを参照するときはいつでも、実際のエンジンではなくモック エンジンを使用していることがわかります。
私が直面している問題は、このエンジンがさまざまなシナリオで異なる動作をすることです。たとえば、 を呼び出すとgetDocuments()
、通常はドキュメントが返されるようにします。しかし、アプリケーション コードが例外を適切に処理していることを確認するために、例外をスローしたい場合もあります。
これは、テスト コードで Bean を参照し、いくつかのスタブを変更することで実現できますが、他のテストもパスするように、スタブを元の状態に戻す必要があります。これは多くの理由で悪い習慣のように思えるので、代替案を探しています。
私が検討した 1 つの代替案は、Bean を完全に再初期化することでした。Bean は、静的ファクトリ メソッドを使用して applicationContext-test.xml から初期化されます。私がやりたいことは次のとおりです。
- テスト コードから Bean を参照して、そのスタブの一部を変更します
- これらの新しいスタブを使用してテストを実行します
- このテストの最後に、applicationContext-test.xml で指定された静的ファクトリ メソッドを使用して Bean を再初期化します。
私はこのようなことを試しました:
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
new String[] { "applicationContext-test.xml" });
Factory factory = appContext.getBean(Factory.class);
factory = EngineMocks.createMockEngineFactory();
しかし、これではうまくいきません。この後に実行されるテストはすべて失敗します。私の新しいfactory
変数にはFactory
必要なものが含まれており、それに応じて動作しているようですが、Bean が他の場所で参照されている場合getDocuments()
でも、以前にスタブされた例外がスローされます。明らかに、私の再初期化はローカル変数にのみ影響し、Bean 自体には影響しませんでした。
どうすれば目標を達成できるか教えてもらえますか?
アップデート
より良いテストとより良いモックを作成する方法についての提案を歓迎しますが、私の目標は Bean を再初期化することです。ユースケースに適合するかどうかに関係なく、これを行う方法を学ぶことには価値があると思います(ユースケースに適合するとは思いますが、ここで批評家を説得するのに苦労しています)。
私から賛成票または緑色のチェックマークを得る唯一の答えは、Bean を再初期化する方法を提案するものです。