1

パラメータ クラスの場合

class Criteria {
    private Map params;
    public getMap(){ return params; }
}

およびサービスメソッドはこの基準を受け入れます

class Service{
    public List<Person> query(Criteria criteria){ ... }
}

カスタム featureMatcher を使用して条件キーを照合します

private Matcher<Criteria> hasCriteria(final String key, final Matcher<?> valueMatcher){
    return new FeatureMatcher<Criteria, Object>((Matcher<? super Object>)valueMatcher, key, key){
        @Override protected Object featureValueOf(Criteria actual){
            return actual.getMap().get(key);
        }
    }
}

引数を検証するためにmockitoを使用する場合:

verify(Service).query((Criteria) argThat("id", hasCriteria("id", equalTo(new Long(12)))));

エラー メッセージは次のことを示しています。

Argument(s) are different! Wanted:
Service.query(
   id <12L>
);
-> at app.TestTarget.test_id (TestTarget.java:134)
Actual invocation has different arguments:
Service.query(
   app.Criteria@509f5011
);

私が使用する場合ArugmentCaptor

ArgumentCaptor<Criteria> argument = ArgumentCaptor.forClass(Criteria.class);
verify(Service).query(argument.capture());
assertThat(argument.getValue(), hasCriteria("id", equalTo(new Long(12))));

メッセージははるかに優れています。

Expected: id <12L> but id was <2L>

を使用せずに、どうすればそのようなメッセージを取得できますArgumentCaptorか?

4

1 に答える 1

1

簡単な答えは、Criteriaコードを調整して、それがあなたの管理下にある場合は、より良いtoStringメソッドを書くことです。それ以外の場合は、メソッドを使用する方がよい場合がありますArgumentCaptor

ArgumentCaptor がないと難しいのはなぜですか? 1 回の呼び出しを想定していることはわかっていますが、Mockito は、評価する類似の呼び出しが多数ある場合でも、それを処理するように設計されています。同じマッチャー実装を使用している場合でも、同じ有用なdescribeMismatch実装を使用すると、assertThat本質的に、一致しない場所で一度verify一致を試み、他の呼び出しとの一致を試み続けます。

このことを考慮:

// in code:
dependency.call(true, false);
dependency.call(false, true);
dependency.call(false, false);

// in test:
verify(mockDependency).call(
    argThat(is(equalTo(true))),
    argThat(is(equalTo(true))));

ここで、Mockito はどの呼び出しが であるべきかを知りませんcall(true, true)。3つのいずれかがそれであった可能性があります。代わりに、期待していた検証が満たされたことがなく、関連する 3 つの呼び出しのうちの 1 つがクローズされた可能性があることのみを認識します。を使用したコードではArgumentCaptor、呼び出しが 1 つしかないという知識を利用して、より適切なエラー メッセージを提供できます。Mockitoの場合、DIDが受信したすべての呼び出しを出力するのが最善であり、toStringあなたにとって役立つ出力がなければ、Criteriaまったく役に立ちません。

于 2013-09-03T22:34:02.677 に答える