2014-10-02 23 views
12

Cihaz testi ile alay yazarken bir sorunum var. Alay etmek için ihtiyacım olan bir nesne var, bu kodda onları çağırdığım bir sürü alıcı var. Ancak, bunlar benim birim testimin amacı değildir. Öyleyse, tek tek taklit etmek yerine tüm yöntemleri alay edebilmemin bir yolu var. İşte Mockito tüm yöntemlerle alay edin ve geri dönün

kod örnektir:

public class ObjectNeedToMock{ 

private String field1; 
... 
private String field20; 

private int theImportantInt; 


public String getField1(){return this.field1;} 
... 

public String getField20(){return this.field20;} 

public int getTheImportantInt(){return this.theImportantInt;} 

} 

ve bu deney sınıfı içinde

public class Service{ 

public void methodNeedToTest(ObjectNeedToMock objectNeedToMock){ 
    String stringThatIdontCare1 = objectNeedToMock.getField1(); 
    ... 
    String stringThatIdontCare20 = objectNeedToMock.getField20(); 
    // do something with the field1 to field20 

    int veryImportantInt = objectNeedToMock.getTheImportantInt(); 
    // do something with the veryImportantInt 

    } 
} 

sınamak için gereken servis sınıftır, test yöntemi

gibi
@Test 
public void testMethodNeedToTest() throws Exception { 
     ObjectNeedToMock o = mock(ObjectNeedToMock.class); 
     when(o.getField1()).thenReturn(anyString()); 
     .... 
     when(o.getField20()).thenReturn(anyString()); 

     when(o.getTheImportantInt()).thenReturn("1"); //This "1" is the only thing I care 

} 
olduğunu

Yani, yararsız "field1" için "field20" için "ne zaman" yazacağımın bir yolu var mı

+0

Sen bunları boş dönen ince iseniz gerekmez. –

+0

Onları bu örnekte göstermediğim için özür dilerim. – jasonfungsing

cevap

22

Sahibin varsayılan yanıtlarını kontrol edebilirsiniz. Eğer mock oluştururken, kullanın:

Mockito.mock(ObjectNeedToMock.class, new Answer() { 
    @Override 
    public Object answer(InvocationOnMock invocation) throws Throwable { 
     /* 
      Put your default answer logic here. 
      It should be based on type of arguments you consume and the type of arguments you return. 
      i.e. 
     */ 
     if (String.class.equals(invocation.getMethod().getReturnType())) { 
      return "This is my default answer for all methods that returns string"; 
     } else { 
      return RETURNS_DEFAULTS.answer(invocation); 
     } 
    } 
})); 
+0

Cevabınızı doğru anladığımdan emin değilim. Hala cevaplama yönteminde alan1 için alan değerini varsayılan değer 20'ye ayarlamanız gerekiyor? – jasonfungsing

+2

@jasonfungsing Hayır yapmazsınız. Bu durumda alay ettiğiniz nesnenin varsayılan davranışını ayarlarsınız. Aslında, eğer 'doReturn (...)' i çağırırsanız,() 'yi kullanırken bu varsayılan davranışı yeni özel stub ile geçersiz kılabilirsiniz. Bu nedenle, bir yöntemin davranışını değiştirmeniz gerekiyorsa, diğerleri hala varsayılanları döndürecekse yararlıdır. BTW, cevabımı güncelledim. – SimY4

+0

Ayrıca, sadece 'sahte (ObjectNeedToMock.class, RETURNS_DEFAULTS);' Ayrıca lambda gerekmez. – Amalgovinus

0

Eğer getField1() belirli bir test durumda getField20() için sonucu ilgilenen değilseniz bunun tamamını alay etmesin. getTheImportantInt() yaklaşık Başka bir deyişle, tüm spesifik test durumu daha sonra test durumu gibi görünmelidir, endişe olmalıdır eğer:

@Test 
public void testMethodNeedToTest() throws Exception { 
     ObjectNeedToMock o = mock(ObjectNeedToMock.class); 
     when(o.getTheImportantInt()).thenReturn("1"); 

     // test code goes here 
} 
+0

Örneğimi değiştirdim, alan1 ile alan20 arasında bir şeyler yapmam gerekiyor, ancak bu test yönteminde bir şey değil. – jasonfungsing

+0

Peki, o zaman bağlıdır. Eğer field1 ile field20 arasında ne yaparsanız testte yaptığınız sonucu etkilerseniz, değerleri alay etmekten başka seçeneğiniz yoktur. Aksi halde, yine de onları göz ardı edebilirsiniz, sonuçta, sınama ile ilgileniyorsunuz tüm bunlardan etkilenmez. Farklı bir notta, 20 alıcıya sahip bir sınıfınız varsa, gerçekten tasarımınızı geliştirmeyi düşünmeniz gerekir (bir varlık sınıfı olsa bile, SQL DB'lerinde uzun satırlar performansı önemli ölçüde azalttığı için DB tablosunu daha az sütun içerecek şekilde yeniden tasarlamaya değerdir. Çoğu DB'de). – eitanfar

+0

Bu 20 getters nesnesinin bir 3. şahıs dinlendirici api çağrısından bir json yanıtı haritalama sınıfı olduğu için şanslıyım :-) – jasonfungsing