以下のサンプル ルーチンの任意のクラス引数を一致させる方法はありますか?
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);
編集: 一つの解決策は
(Class<?>) any(Class.class)
ベストアンサー1
他に 2 つの方法があります (@Tomasz Nurkiewicz による前回の回答に対する私のコメントを参照してください)。
最初の方法は、コンパイラが間違った型のものを渡すことを許可しないという事実に依存しています。
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);
ここで、は次のように定義さ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()
:-)