1. ホーム
  2. java

[解決済み] Mockitoは任意のクラス引数にマッチする

2022-03-10 08:07:01

質問

以下のサンプルルーチンの任意のクラス引数にマッチさせる方法はありますか?

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

どうすれば <強い 常に を返します。 new B() にどのクラスが渡されたかに関係なく method ? 次の試みは、特定のケースでのみ機能します。 A がマッチングされます。

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


EDIT : 一つの解決策は

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

解決方法は?

もう2つの方法があります(@Tomasz Nurkiewicz さんの前回の回答に対する私のコメント参照)。

1つ目は、コンパイラが間違った型のものを渡すことを許さないという事実に頼っています。

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

正確な型付けができなくなる( Class<? extends A> が、おそらくあなたが必要とするように動作します。

2つ目の方法は、より複雑ですが、以下のような場合、間違いなくより良い解決方法です。 本当に への引数を確実にしたい。 method()A またはそのサブクラス A :

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

ここで ClassOrSubclassMatcherorg.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() が実際に返すものです :-)