19

私はモックでMockitoを使用してこれを行おうとしています:
Mock.someMethod(..)がargument1-> return result1で呼び出され
たときMock.someMethod(..)がargument2-で呼び出されたとき-> return result2
When Mock.someMethod (..)はargument3->returnresult3で呼び出されます

    when(mock.method(Matchers.argThat(new MyMatcher1() {

        @Override
        public boolean matches(Object arg0) {
                   // comparision logic
        }
    }))).thenReturn(result1);

    when(mock.method(Matchers.argThat(new MyMatcher2() {

        @Override
        public boolean matches(Object arg0) {
                   // comparision logic
        }
    }))).thenReturn(result2);

    when(mock.method(Matchers.argThat(new MyMatcher3() {

        @Override
        public boolean matches(Object arg0) {
                   // comparision logic
        }
    }))).thenReturn(result3);

しかし、Mockitoは最初のものを正しくスタブしますが、2番目のものでは、何らかの理由でMatcherをnull agrumentで実行しようとするため、NullPointer例外をスローします。サポートされているかどうかはわかりません。

これが正しい方法ではない場合、Mockitoでこれを達成する方法は?ありがとう。

4

3 に答える 3

29

書く代わりに

when(mock.method(Matchers.argThat(new MyMatcher1() {
    @Override
    public boolean matches(Object arg0) {
           // comparison logic
    }
}))).thenReturn(result1);

これを試して。

doReturn(result1).when(mock).method(Matchers.argThat(new MyMatcher1() {

    @Override
    public boolean matches(Object arg0) {
               // comparison logic
    }
}));

result2とについても同様ですresult3

これはhttp://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#12で説明されていますが、私の意見では、この構造が実際に必要であるという事実についてドキュメントは不明確です場合。ここでドキュメントの改善について、Mockito チームの他のメンバーと話し合います。

幸運を。

于 2012-12-13T02:19:45.730 に答える
3

経験則として、テストが失敗した場合、テスト中のユニットの問題点を特定できるはずです。1 つのテスト専用のカスタム マッチャーを作成することは避けてください。メソッドが複数の値を返す必要がある場合、通常は、テストが予測する順序で値を返すことにより、メソッドを単純にスタブするだけで十分です。

例えば

when(mock.method(any(Object.class))).thenReturn(result1, result2, result3);

これにより、最初の呼び出しでは結果 1 が返され、2 回目の呼び出しでは結果 2 というように返されます。

これでは不十分なシナリオもあることは明らかですが、多くの場合、テストは単純であるほど優れています。

于 2012-12-12T21:57:10.847 に答える
2

カスタムArgumentMatcherでnullチェックを行うことで、今のところ問題を回避することができました。NPEは、Mockitoがwhen()ステートメントを呼び出している起動時のみであるため、これは機能しました。現時点では、ArgumentMatcher.matches()を呼び出さないでください。Mockitoのバグのように感じます。

于 2012-12-12T22:27:21.017 に答える