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해야 할 패키지를 모르는 경우:
import static org.mockito.ArgumentMatchers.any;
any(SomeClass.class)
또는
import org.mockito.ArgumentMatchers;
ArgumentMatchers.any(SomeClass.class)
그럼 어떻게 해?
when(a.method(isA(A.class))).thenReturn(b);
또는 다음과 같이 입력합니다.
when(a.method((A)notNull())).thenReturn(b);
mockito의 최신 버전에서는 millhouse의 솔루션이 더 이상 작동하지 않습니다.
이 솔루션은 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);
다른 클래스 유형 파라미터에 대해 하나의 메서드를 여러 번 조롱해야 하므로 위의 예제는 모두 효과가 없습니다.
대신, 이것은 효과가 있다.
//Handle InstrumentType.class
Mockito.doReturn(new InstrumentTypeMapper() {
@Override
public InstrumentType map(String sourceType) throws Exception {
return InstrumentType.Unknown;
}
}).when(mappingLoader).load(any(ServiceCode.class), argThat(new ArgumentMatcher<Class<InstrumentType>>() {
@Override
public boolean matches(Class<InstrumentType> argument) {
return InstrumentType.class.isAssignableFrom(argument);
}
}));
//Handle InstrumentSubType.class
Mockito.doReturn(new InstrumentSubTypeMapper() {
@Override
public InstrumentSubType map(String sourceType) throws Exception {
return InstrumentSubType.istNone;
}
}).when(mappingLoader).load(any(ServiceCode.class), argThat(new ArgumentMatcher<Class<InstrumentSubType>>() {
@Override
public boolean matches(Class<InstrumentSubType> argument) {
return InstrumentSubType.class.isAssignableFrom(argument);
}
}));
단축버전은 다음과 같습니다.
Mockito.doReturn(new InstrumentTypeMapper() {
@Override
public InstrumentType map(String sourceType) throws Exception {
return InstrumentType.Unknown;
}
}).when(mappingLoader).load(any(ServiceCode.class), argThat((ArgumentMatcher<Class<InstrumentType>>) InstrumentType.class::isAssignableFrom));
Mockito.doReturn(new InstrumentSubTypeMapper() {
@Override
public InstrumentSubType map(String sourceType) throws Exception {
return InstrumentSubType.istNone;
}
}).when(mappingLoader).load(any(ServiceCode.class), argThat((ArgumentMatcher<Class<InstrumentSubType>>) InstrumentSubType.class::isAssignableFrom));
보시다시피 커스텀 Argument Matchers를 arg That과 함께 사용하고 있습니다.이것이 동작하는 보다 짧은 방법이 있는지는 잘 모르겠습니다.
언급URL : https://stackoverflow.com/questions/7500312/mockito-match-any-class-argument
'programing' 카테고리의 다른 글
Vue.js에서 소품 데이터를 다른 컴포넌트에 올바르게 전달하는 방법 (0) | 2022.07.29 |
---|---|
Vue가 vuex에서 가져오는 내 개체의 업데이트를 보지 못함 (0) | 2022.07.29 |
Vue-router가 페이지를 새로고침하면 상태가 상실됩니다.이 문제를 회피하려면 어떻게 해야 합니까? (0) | 2022.07.28 |
명령 플래그를 사용하여 향후 공유 라이브러리에서 중단점을 설정하는 방법 (0) | 2022.07.28 |
좌측 피연산자 값이 음수인 경우 좌측 시프트 작업이 정의되지 않은 동작을 호출하는 이유는 무엇입니까? (0) | 2022.07.28 |