2008-10-22 17 views
7

Aşağıdaki sınıfa sahibim:JMockit ile soyut sınıflardaki halka açık olmayan statik yöntemlere mi geçiyorsunuz?

public abstract class AbstractParent { 
    static String method() { 
     return "OriginalOutput"; 
    } 
} 

Bu yöntemle dalga geçmek istiyorum. Xzx42 kullanmaya karar verdim. Ben bir alay sınıfı oluşturmak:

public class MockParent { 
    static String method() { 
     return "MOCK"; 
    } 
} 

Ve benim test kodum şöyle görünüyor:

public class RealParentTest { 

    @Before 
    public void setUp() throws Exception { 
     Mockit.redefineMethods(AbstractParent.class, MockParent.class); 
    } 


    @Test 
    public void testMethod() { 
     assertEquals(MockParent.method(),AbstractParent.method()); 
    } 

} 

Ne yazık ki bu test, AbstractParent'in "MOCK" yerine "OriginalOutput" döndürdüğünü söylüyor. Herhangi bir fikir neden? Yanlış bir şey mi yapıyorum? Sahte sınıfımı da soyut olarak ilan etmeyi denedim, boşuna.

Düzenleme Yöntemi kamuya açık hale getirmenin testin sorunsuz bir şekilde çalışmasına neden olduğunu unutmayın ... bu garip çünkü JMockit ile herhangi bir kapsamdaki yöntemlerle alay edebilmeniz gerekiyor.

Cevap Sadece sahte yöntem kamuya açık olmalı, orijinal yöntemi olduğu gibi bırakabilirsiniz.

+0

Sadece geçen googler için ... kabul edilen cevap Mockit.redefineMethods'ın kullanımdan kaldırıldığı tarihte artık geçerli değil ... Doğruyu bulmaya çalışıyorum. –

cevap

6

Çözüm bulundu: sadece alay'ın yöntemini genel yapmak gerekir (özgün yöntem, orijinal görünürlüğünde kalabilir).

Neden orijinal yolun bu şekilde çalıştığını bilmiyorum (bunu yapan bir kişi sizi aramaktan daha fazlasıdır), ancak yapmanız gereken tek şey yukarıdaki örnekte bulunan sahte sınıfı değiştirmektir:

public class MockParent { 
    public static String method() { 
     return "MOCK"; 
    } 
} 
+1

MockParent'te bunu statik yapmak zorunda bile değilsiniz. –

+1

jmockit yalnızca kamu yöntemlerine bakar. Bu, sahte uygulamanızın, –

+2

kaynak sınıfındaki yöntemlerle uyuşmayan iç yöntemlere sahip olmasına izin verir. Sahte yönteminin neden açık olması gerektiğinin nedeni, JMockit'in sahte yöntem için sahte yöntemini değiştirmesidir. Yani, özgün yönteme yapılan bir çağrı, aynı yöntem içinde alay için yönlendirilir. Bu nedenle, sahte yöntemin, aramanın eklendiği noktadan erişilebilir olması gerekir. –

4

görünüşe bunu yapmak için yeni bir yol MockUp<T>

new MockUp<AbstractParent>(){ 
    @Mock String method() { 
     return "MOCK"; 
    } 
}; 

assertEquals("MOCK" AbstractParent.method()); 

diğer alternatif bir @MockClass annonation ile MockParent böyle bir şeyle devam etmek görünüşe göre kullanmaktır. Bunu, başka bir inline versiyonun işi yaptığı gibi yapmadım.

Bunu bir örnekte project on github uygulamıştım.

+0

Özgün 'AbstractParent.method()' 'statik '' dir. Bu şekilde 'statik' yöntemleri için alınamaz. –

+3

@Adeel Farklı olmaya çalışıyorum https://github.com/gid79/q224721-jmockit-non-public-methods –

+0

Daha önce yaptığım yorum için özür dilerim, aslında denedim ama gerçekten çalışmıyordum, sonra bunu bilmeliyim Bu tamamen farklı bir şey yüzünden oldu. Örnek vermek için +1. –

İlgili konular