1

mockitoでカスタム引数マッチャーを作成しています。この例の使用:

class IsListOfTwoElements extends ArgumentMatcher<List> {
    public boolean matches(Object list) {
        return ((List) list).size() == 2;
    }
}

これは、なぜパラメータのタイプがの代わりになっているのか疑問に思いlistましObjectList。match関数に渡される引数は他のものにすることができますか?もしそうなら、例はパラメータのタイプをチェックし、そうでないfalse場合は返すべきではありませんListか?

質問を少し言い換えると、mockitoはmatches関数に正しいタイプのみをパスすることを約束しますか?もしそうなら、なぜそれはジェネリック型を使用しないのですか?そうでない場合、間違ったタイプが渡された場合に例がfalseを返さないのはなぜですか?

4

2 に答える 2

3
  • を拡張するArgumentMatcherと、オブジェクトを受け取り、それをキャストするのはあなたの責任です。Mockitoはクラス名に基づいてそれを説明します。
  • を拡張するBaseMatcherと、オブジェクトを受け取り、それをキャストするのはあなたの責任です。説明には、マッチャーが渡されたものだけが記載されており、期待していたものは記載されていません。
  • を使用するTypeSafeMatcherと、選択したタイプのオブジェクトを受け取り、それを説明するのはあなたの責任です。非ヌルとクラスタイプをチェックし、クラスが一致しない場合は正常なエラーメッセージを提供します。

マッチャーで悪いキャストをすることを心配しないでください。Mockitoは、検証呼び出しの一致の両方で、非常に寛大なtry / catchブロック内で検証への呼び出しをラップするため、ClassCastExceptionはとにかくfalseを返します(または一致しません)。


では、なぜインターフェイスMatcherはその型パラメータが許可する以上のものを受け入れるのでしょうか?

このメソッドは、ジェネリック型TではなくObjectと照合されます。これは、Matcherの呼び出し元が実行時に型が何であるかを知らないためです(Javaジェネリックによる型消去のため)。正しいタイプをチェックするのは実装次第です。

つまり、Matcherがパラメーター化されたとしても、実行時に非常に強力な型安全性チェックを提供することはありません。ただし、Mockitoでは、これは非常に便利です。の代わりにargThat(Matcher<T>)typeの値を返すため、テストでのすべての使用をキャストする必要はありません。TObjectargThat(...)

于 2012-10-25T20:55:06.967 に答える
1

mockitoマッチャーはHamcrestマッチャーを使用するため、指定したjavadocリンクで、実際のインターフェースでは一般的ではないように見えるmatchesinインターフェースの署名を継承していることがわかります。org.hamcrest.Matcher

コンパイラーが彼の仕事を正しく行った場合、あなたは正しいタイプを取得すると仮定することができます。

このArgumentCaptorアプローチは、たとえばAssertJ(FEST-Assertの維持されたクローン)を使用できる複雑なアサーションに対して推奨されることに注意してください。

于 2012-10-25T10:12:43.390 に答える