Mockito는 모든 클래스 인수와 일치
아래 샘플 루틴의 클래스 인수와 일치하는 방법이 있습니까?
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)
그것을하는 두 가지 방법 (@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()
실제로 돌아갑니다 :-)
캐스트하지 않고 다른 방법으로 수행 할 수 있습니다.
when(a.method(Matchers.<Class<A>>any())).thenReturn(b);
이 솔루션은 메서드 any()
가 Class<A>
기본값 ( Object
)이 아닌 형식 을 반환하도록 합니다 .
어떤 패키지를 가져와야할지 모른다면 :
import static org.mockito.Matchers.any;
any(SomeClass.class)
또는
import org.mockito.Matchers;
Matchers.any(SomeClass.class)
어때요?
when(a.method(isA(A.class))).thenReturn(b);
또는:
when(a.method((A)notNull())).thenReturn(b);
millhouse의 솔루션이 더 이상 최신 버전의 mockito에서 작동하지 않습니다.
이 솔루션은 Java 8 및 mockito 2.2.9에서 작동합니다.
ArgumentMatcher
인스턴스는 어디에 있습니까org.mockito.ArgumentMatcher
public class ClassOrSubclassMatcher<T> implements ArgumentMatcher<Class<T>> {
private final Class<T> targetClass;
public ClassOrSubclassMatcher(Class<T> targetClass) {
this.targetClass = targetClass;
}
@Override
public boolean matches(Class<T> obj) {
if (obj != null) {
if (obj instanceof Class) {
return targetClass.isAssignableFrom( obj);
}
}
return false;
}
}
그리고 사용
when(a.method(ArgumentMatchers.argThat(new ClassOrSubclassMatcher<>(A.class)))).thenReturn(b);
참고 URL : https://stackoverflow.com/questions/7500312/mockito-match-any-class-argument
'Programing' 카테고리의 다른 글
EF 5 코드 우선 마이그레이션에서 전체 SQL 스크립트 생성 (0) | 2020.06.26 |
---|---|
select *를 사용하지 않는 이유는 무엇입니까? (0) | 2020.06.26 |
열거 형의 최대 값 얻기 (0) | 2020.06.26 |
jquery를 사용하여 입력 유형을 얻는 방법은 무엇입니까? (0) | 2020.06.26 |
프로비저닝 프로파일을 생성하지 못했습니다. (0) | 2020.06.25 |