それを行うための2つの方法(@Tomasz Nurkiewiczによる以前の回答に関する私のコメントを参照):
1つ目は、コンパイラーが間違った型のデータを渡せないという事実に依存しています。
when(a.method(any(Class.class))).thenReturn(b);
正確なタイピング(Class<? extends A>
)は失われますが、おそらく必要に応じて機能します。
第二は、より多く関与していますが、あれば間違いなくより良い解決策である、本当に確認の引数があることになりたい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");
}
}
ふew!あなたがするまで、私は最初のオプションと一緒に行きたい、本当に何をより細かく制御を取得する必要がありmethod()
、実際に戻ります:-)
Class<?>
すごい!