1

ご挨拶。

Web アプリでテストするために検索エンジンをモックしています。この検索エンジンは、異なるスキーマを持つ xml ドキュメントを返します。スキーマは、コレクション セットと呼ばれるパラメーターに依存します。コレクション セットに基づいて異なるスキーマを返すことは、モック化が難しい部分です。コレクション セットの指定は、基本的にセットアップ メソッドであり、無効なメソッドであるためです。この検索エンジンは外部の jar ファイルであるため、API を変更することはできません。提供されたもので作業する必要があります。次に例を示します。

Engine engine = factory.getEngine();
Search search = engine.getSearch();
search.addCollectionSet(someCollectionSet);
SearchResult result = search.getSearchResult();
Document[] documents = result.getAllDocuments();

次に、ドキュメントごとに、次のように呼び出して xml を取得できます。

document.getDocumentText();

モック オブジェクトを使用している場合getDocumentText()、ジェネレーターによって作成された、スキーマに準拠した xml 文字列を返します。私がやりたいことは、上記の最初のコード スニペットの手順 3 で提供されたコレクション セットに応じて、異なる種類のジェネレータを使用することです。私はこのようなことをしようとしてきました:

    doAnswer(new Answer() {
        Object answer(InvocationOnMock invocation) {
            if (args == "foo") {
                SearchResult result = getMockSearchResult();
                when(search.getSearchResult()).thenReturn(result);
            }
        }
    }).when(search.addCollectionSet(anyString()));

しかし、これは多くの赤いハイライトになります:)

基本的に、私の目標はキーをオフにしaddCollectionSet(someCollectionSet)て、呼び出されたときにパラメーターをオフにして、別のジェネレーターが使用されるようにすることです。どうすればこのようなことを達成できるか知っている人はいますか? または、ジェネレーターを条件付きで接続するために使用できる何らかの形式の依存性注入があるのでしょうか?

ありがとう!

アップデート

エンジンを返さないようにファクトリ オブジェクトを変更しましたが、そのエンジンからの検索オブジェクトと検索オブジェクトを返すようにしました。これで、次のようなことができるようになりました。

Search search = factory.getSearch(collectionSet);

だから私がやりたいことは次のようなものです:

when(factory.getSearch(anyString()).thenAnswer(new Answer() {
    Object answer(InvocationOnMock invocation) {
        switch(args[0]) {
            case fooSet: return fooSearch; break;
            case barSet: return barSearch; break;   

つまり、switch ステートメントで getSearch に渡された文字列をキーオフしたいということです。確かに、以下でフェリックスが提案したようなことをもっと行うこともできますが、すべてのケースをスイッチでラップしたほうがよいでしょう。誰かがこれを行う方法の例を提供できますか? ありがとう!

アップデート

モック呼び出しに渡される引数をキャプチャできることを見てきましたが、これらのキャプチャされた引数は後のアサーションに使用されます。モックへの呼び出しが引数に応じて異なる値を返すように、これらの引数をキーオフする方法を見たことがありません。これを行う方法が必要なようです.Mockitoでそれを理解するのに十分な経験がありません. しかし、確かに誰かがそうします!

4

1 に答える 1

1

レガシーコードへの呼び出しを独自のオブジェクトにラップすることをお勧めします。したがって、これらの線に沿って独自の方法を使用することになります。

class SearchEngineWrapper {
  public String getSearchResult(String collection){
    Engine engine = factory.getEngine();
    Search search = engine.getSearch();
    search.addCollectionSet(someCollectionSet);
    SearchResult result = search.getSearchResult();
    ...
    return document.getDocumentText();
  }
}

これで、このメソッドをモックアウトできます。この方法はまた、あなたの意図をうまく文書化します。また、統合テストで実際の実装をテストすることもできます。

when(searchEngineWrapper.getSearchResult("abc").thenReturn("foo");
when(searchEngineWrapper.getSearchResult("xyz").thenReturn("bar");
于 2010-12-02T18:25:16.060 に答える