0

外部検索エンジンをモックするために使用する applicationContext-test.xml に Bean があります。このようにして、テストを実行するとき、アプリケーション コードがこの検索エンジンを参照するときはいつでも、実際のエンジンではなくモック エンジンを使用していることがわかります。

私が直面している問題は、このエンジンがさまざまなシナリオで異なる動作をすることです。たとえば、 を呼び出すとgetDocuments()、通常はドキュメントが返されるようにします。しかし、アプリケーション コードが例外を適切に処理していることを確認するために、例外をスローしたい場合もあります。

これは、テスト コードで Bean を参照し、いくつかのスタブを変更することで実現できますが、他のテストもパスするように、スタブを元の状態に戻す必要があります。これは多くの理由で悪い習慣のように思えるので、代替案を探しています。

私が検討した 1 つの代替案は、Bean を完全に再初期化することでした。Bean は、静的ファクトリ メソッドを使用して applicationContext-test.xml から初期化されます。私がやりたいことは次のとおりです。

  1. テスト コードから Bean を参照して、そのスタブの一部を変更します
  2. これらの新しいスタブを使用してテストを実行します
  3. このテストの最後に、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 を再初期化する方法を提案するものです。

4

3 に答える 3

1

結果が必要な場合と例外が必要な場合を定義する必要があります。これらは、メソッドへの入力パラメーターによって区別する必要があります。そうでなければ、それは良いテストではありません。したがって、特定の一連のパラメーターについて、出力は予測可能でなければなりません。

于 2010-12-06T22:03:44.477 に答える
0

それ以外の:

factory = EngineMocks.createMockEngineFactory();

行う:

factory.callMethodThatChangesTheStateOfThisObjectSuchThatItIsSuitableForYourTest(withOptionalParameters);

また、Spring Integration Testingを使用している場合は、次のテストに影響を与えないように、必ず@DirtiesContextでメソッドにアノテーションを付けてください。

于 2011-03-25T03:15:11.357 に答える
0

検索エンジンのさまざまな実装を注入するのはどうですか? 検索エンジンのさまざまなモックを表す Bean をさらに作成するだけです。

  • 1 つのテスト クラスが 1 つのモックで初期化され、別のテスト クラスが別のモックで初期化されます。もちろん、これは、テストしている特定のクラスに対してより多くのテストクラスがあることを意味します(それほど良くない/きれいではありません)

また...

  • 1 つのテスト クラスに (検索エンジンの) より多くのモックを挿入します。一部のテスト メソッド (そのテスト クラスから) は 1 つのモックを使用し、他のテスト メソッドは別のモックを使用します。
于 2010-12-07T16:10:50.280 に答える