2016-10-24 11 views
1

私は、この試合を否定するので、サイズが2でない場合に一致し、MockitoのArgumentMatcherを否定する方法は?

Mockito.doReturn(false).when(mock).addAll(Mockito.argThat(AdditionalMatchers.not(new IsListOf2Elements()))); 

したい。しかし、これは正しくない、

private class IsListOf2Elements implements ArgumentMatcher<List<String>>{ 
    @Override 
    public boolean matches(List<String> argument) { 
     return ((List<String>)argument).size()==2; 
    } 
} 

ArgumentMatcherを作成しました。私はあなたがAdditionalMatchers.notメソッドのパラメータとしてカスタム照合を使用することができないことであるように思わ

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: 
No matchers found for additional matcher Not(?) 
-> at my.test.own.Mockito_aTest.test4e(Mockito_aTest.java:136) 

答えて

1

、取得します。

ただし、代わりにhamcrest org.hamcrest.CoreMatchersを使用できます。これは動作するはずです:

Mockito.doReturn(false).when(mock).addAll(Mockito.argThat(CoreMatchers.not(new IsListOf2Elements()))); 

はそれが私が答えを自分で見つけ

+0

いいえ、これは動作しません。 – ericj

+0

奇妙な、それは私のためにうまくいった。たぶんバージョンの問題、私Mockitoのバージョン(1.9.5)でArgumentMatcherは抽象クラスではなく、あなたのOPのようにインターフェースですので。あなたはどのバージョンを使用していますか? – troig

+0

私はそれを解決しました。 ; ' – ericj

0

に役立ちます願っています。ターンは

Mockito.doReturn(false).when(mock).addAll(AdditionalMatchers‌​.not(Mockito.argThat‌​(new IsListOf2Elements()))); 

理由はAdditionalMatchers‌​.notが登録マッチャーを期待していることである、とMockito.argThat‌はそれをするのか、周りにあります。

1

参考として、Hamcrest matchers and Mockito matchers behave very differentlyに注意してください。 HamcrestのステートレスMatcherオブジェクトは、マッチ関数をインスタンスとして表し、結果を逆転させるためにラップすることができます。 Mockitoの "登録されたマッチャー"は副作用だけで動作します。

argThatはMockito整合にHamcrest整合を適応させる、HamcrestのCoreMatchers.notはHamcrest整合を反転してMockitoのAdditionalMatchers.notは(副作用を介して)Mockito整合を反転させます。これは、CoreMatchers.notが常にMatcher<T>を返し、AddionalMatchers.notが任意のTを返す理由の一部です。あなたが見ることができないMockito状態で動作しています。

これはあなたに次の動作なります:あなたが作っている例外はスタブ行動についてである場合

// BAD: Don't use AdditionalMatchers to invert a Hamcrest matcher. 
doReturn(false).when(mock).addAll(
    Mockito.argThat(AdditionalMatchers.not(new IsListOf2Elements()))); 

// GOOD: Use AdditionalMatchers to invert a Mockito matcher. (See ericj's answer.) 
doReturn(false).when(mock).addAll(
    AdditionalMatchers​.not(Mockito.argThat‌​(new IsListOf2Elements()))); 

// ALSO GOOD: Use CoreMatchers to invert a Hamcrest matcher. (See troig's answer.) 
doReturn(false).when(mock).addAll(
    Mockito.argThat‌​(CoreMatchers.not(new IsListOf2Elements()))); 

を、あなたはまた、特定の例外に加えて、一般的な振る舞いをスタブにしmore-specific overrideを使用することができます。

+0

すばらしい説明! – troig

+0

@troigありがとう!あなたの答え(とericjの)にコールアウトを追加することを忘れてしまいました。ただでそれを編集していない。すべての –

+0

心配:)私は@ericjは、この答えを受け入れるべきだと思います。 – troig

関連する問題