>

아래 샘플 루틴의 클래스 인수와 일치하는 방법이 있습니까?

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

    두 가지 방법이 더있다 (@Tomasz Nurkiewicz의 이전 답변에 대한 나의 의견 참조) :

    첫 번째는 컴파일러가 단순히 잘못된 유형의 무언가를 전달할 수 없다는 사실에 의존합니다.

    when(a.method(any(Class.class))).thenReturn(b);
    
    

    정확한 타이핑 ( Class<? extends A> ) )하지만 필요에 따라 작동 할 수 있습니다.

    두 번째는 훨씬 더 복잡하지만 wemwyz에 대한 논거를 확실하게하고 싶다면 확실히 더 나은 해결책입니다.   method() 입니다  또는 A 의 서브 클래스 :

    A
    
    

    와이즈 비즈   when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b); 입니다  다음과 같이 정의 됨 :

    ClassOrSubclassMatcher
    
    

    휴! 나는실제org.hamcrest.BaseMatcher 가 무엇을 더 잘 제어해야 할 때까지 첫 번째 옵션을 사용합니다.  실제로 다음을 반환합니다 :-)

  • 답변 # 2

    캐스트하지 않고 다른 방법이 있습니다 :

    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() ) ).

  • 답변 # 3

    가져올 패키지를 모를 경우 :

    Class<A>
    
    

    또는

    Object
    
    

  • 답변 # 4

    어떻게 :

    import static org.mockito.Matchers.any;
    any(SomeClass.class)
    
    

    또는 :

    import org.mockito.Matchers;
    Matchers.any(SomeClass.class)
    
    

  • 답변 # 5

    제조소의 솔루션이 더 이상 최신 버전의 mockito에서 작동하지 않습니다

    이 솔루션은 Java 8 및 mockito 2.2.9에서 작동합니다.

    여기서 when(a.method(isA(A.class))).thenReturn(b);   when(a.method((A)notNull())).thenReturn(b); 의 인스턴스입니다

    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; } }

  • 이전 syntax - 이 Java 코드에서 실제로 밑줄은 무엇입니까?
  • 다음 amazon web services - 더 빠른 s3 버킷 복제