두 가지 방법으로 더 할 수 있습니다 (@Tomasz Nurkiewicz의 이전 답변에 대한 내 의견 참조).
첫 번째는 컴파일러가 단순히 잘못된 유형의 무언가를 전달할 수 없다는 사실에 의존합니다.
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");
}
}
휴! 당신이 때까지 나는 첫 번째 옵션과 함께 가고 싶어 정말 무엇을 통해 세밀하게 제어를 얻을 필요가 method()
실제로 돌아갑니다 :-)
Class<?>
놀랄 만한!