177

以下のサンプル ルーチンのクラス引数を一致させる方法はありますか?

class A {
     public B method(Class<? extends A> a) {}
}

に渡されるクラスに関係なく、どうすれば常にa を返すことができますか? 次の試行は、一致する特定のケースでのみ機能します。new B()methodA

A a = new A();
B b = new B();
when(a.method(eq(A.class))).thenReturn(b);

編集:1つの解決策は

(Class<?>) any(Class.class)
4

6 に答える 6

213

それを行うためのさらに2つの方法(@Tomasz Nurkiewiczによる以前の回答に関する私のコメントを参照してください):

1つ目は、コンパイラーが間違ったタイプのものを渡さないようにするという事実に依存しています。

when(a.method(any(Class.class))).thenReturn(b);

正確な入力()は失わClass<? extends A>れますが、おそらく必要に応じて機能します。

2つ目はもっと複雑ですが、の引数が:のまたはサブクラスであることを本当に確認したい場合は、間違いなくより良い解決策です。method()AA

when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);

ClassOrSubclassMatcherは次のようにorg.hamcrest.BaseMatcher定義されています。

public class ClassOrSubclassMatcher<T> extends BaseMatcher<Class<T>> {

    private final Class<T> targetClass;

    public ClassOrSubclassMatcher(Class<T> targetClass) {
        this.targetClass = targetClass;
    }

    @SuppressWarnings("unchecked")
    public boolean matches(Object obj) {
        if (obj != null) {
            if (obj instanceof Class) {
                return targetClass.isAssignableFrom((Class<T>) obj);
            }
        }
        return false;
    }

    public void describeTo(Description desc) {
        desc.appendText("Matches a class or subclass");
    }       
}

ふぅ!実際に何が返されるかを本当に細かく制御する必要があるまで、最初のオプションを選択しmethod()ます:-)

于 2011-10-07T03:59:19.760 に答える
66

キャストせずにそれを行う別の方法があります:

when(a.method(Matchers.<Class<A>>any())).thenReturn(b);

この解決策は、メソッドがデフォルト値 ( ) ではなく型any()を返すように強制します。Class<A>Object

于 2016-01-12T20:07:43.677 に答える
57

どのパッケージをインポートする必要があるかわからない場合:

import static org.mockito.ArgumentMatchers.any;
any(SomeClass.class)

また

import org.mockito.ArgumentMatchers;
ArgumentMatchers.any(SomeClass.class)
于 2016-04-06T03:09:11.853 に答える
30

どうですか:

when(a.method(isA(A.class))).thenReturn(b);

また:

when(a.method((A)notNull())).thenReturn(b);
于 2011-09-21T13:15:05.137 に答える