SORU
21 EYLÜL 2011, ÇARŞAMBA


Mockito herhangi bir sınıf değişkeni maç

Bir şekilde örnek rutin altında herhangi bir sınıf değişkeni maç var mı?

class A {
     public B method(Class<? extends A> a) {}
}

Nasıl yapabilirimher zamannew B() method içine geçmiş olan ne olursa olsun geri dönüş? Aşağıdaki girişimi sadece A uyumlu olduğu özel durum için çalışır.

A a = new A();
B b = new B();
when(a.method(eq(A.class))).thenReturn(b);

EDİT: Bir çözümdür

(Class<?>) any(Class.class)

CEVAP
7 EKİM 2011, Cuma


İki yol yapmak (benim @tarafından önceki haber: Tomasz Nurkiewicz):

İlk derleyici sadece geçmek yanlış türde bir şeye izin vermez gerçeğini dayanır:

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

Tam yazmaya kaybetmek (Class<? extends A>) ama muhtemelen buna ihtiyacınız var gibi çalışır.

İkinci çok daha karmaşıktır ama belki siz daha iyi bir çözümdürgerçekten14 ** bağımsız A A ya da bir alt sınıf olduğundan emin olmak istiyorum:

when(a.method(Matchers.argThat(new ClassOrSubclassMatcher<A>(A.class)))).thenReturn(b);

ClassOrSubclassMatcher bir org.hamcrest.BaseMatcher olarak tanımlanır:

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

Vay! Senin kadar ilk seçenek ile gitmek istiyorumgerçektenmethod() aslında döner ne üzerinde daha iyi kontrol almak gerekir :-)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jose LviS el Bambino ( JLB )   LviSito

    Jose LviS el

    3 ŞUBAT 2008
  • Makeup Lover

    Makeup Lover

    12 HAZİRAN 2011
  • Showtime

    Showtime

    21 HAZİRAN 2006