2016-03-24 41 views
1

documentation'a göre, stubbed olmayan yöntemler null değerini döndürür. Bazı durumlarda "null" döndürmesi gereken bir yöntemi test etmek istiyorum, ancak yöntemin çağrılmadığını belirten istisna ile test başarısız. Mockito: varsayılan döndürme değeri

Bu

Test init fonksiyonudur:

@Before 
public void setup() throws Exception { 
    MockitoAnnotations.initMocks(this); 
    mDataEntry = getFakeEntry(); 
    when(mRepository.getEntry(1L)).thenReturn(mDataEntry); 
    mGetEntry = new GetEntryImpl(mRepository); 
} 

ve bu başarısız bir test:

@SuppressWarnings("unchecked") 
@Test 
public void testGetEntry_failure() throws Exception { 
    mGetEntry.execute(2L, mCallback); 
    verify(mRepository).getEntry(eq(2L)); 
    verify(mCallback).onError(anyString(), Mockito.any(Exception.class)); 
} 

yürütme yöntemini çağırdığında alay nesne mRepository fonksiyonu getEntry I bekliyordu (2 L) dönüş null. Ancak, bu ben testi çalıştırdığınızda mockito bana ne anlatıyor: Ben init işlevine

when(mRepository.getEntry(2L)).thenReturn(null); 

ekleyerek çalıştı

Wanted but not invoked: 
mRepository.getEntry(2); 
-> at com.xyz.interactor.GetEntryTest.testGetEntry_failure(GetEntryTest.java:54) 
Actually, there were zero interactions with this mock. 

ama hiç fark etmez. Geçerli bir nesneyi null yerine döndürürsem, sınama beklendiği gibi başarısız olur, çünkü onError işlevi çağrılmaz (dolayısıyla geçerli bir döndürme değeri belirttiğimde alay edilen nesnenin 2L değeri için işlevi çağrılır).

Atanmış nesne değerlerini null değeri için null nasıl alabilirim?

Düzenleme: Burada

test altında işlev için kod:

@Override 
public void execute(final long id, final Callback<DataEntry> callback) { 
    AsyncTask.execute(new Runnable() { 
     @Override 
     public void run() { 
      DataEntry dataEntry = mDataEntryRepository.getEntry(id); 
      if (dataEntry != null) { 
       callback.onResult(dataEntry); 
      } else { 
       callback.onError("TODO", null); 
      } 
     } 
    }); 
} 

ve başvuru için, başarı testi çalışır:

@SuppressWarnings("unchecked") 
@Test 
public void testGetEntry_success() throws Exception { 
    mGetEntry.execute(1L, mCallback); 
    verify(mRepository).getEntry(eq(1L)); 
    verify(mCallback).onResult(eq(mDataEntry)); 
} 
+2

Hiçbir zaman çağrılmadıysa bir yöntem döndüremezsiniz. Kendinize sormanız gereken soru, test sırasında 'execute()' 'getEntry()' ya da başka herhangi bir “mRepository” yöntemini çağırmamasıdır. 'Execute() 'için kod göndermediniz, bu yüzden kimse burada cevabı bilmiyor. –

+0

Geçerli bir nesneyi döndürerek 2L değerini atarsam yöntem çağrılır, bu nedenle neden çağrılmadığı sorun olmaz. – Francesc

cevap

1

Sorunun sanmıyorum Mockito varsayılan değerleri ile/dönen null.

Değiştirilmiş bir SSCCE yazdım ve testler benim için iyi çalışıyor. Android API'm yok, bu yüzden AsynchTask.execute() işlevini kullanamadım. Anladığım kadarıyla, bu kod ayrı bir iş parçacığında yayınlanacak. Bu nedenle, kodun doğrulanma çağrılmadan önce çalıştırıldığından emin olmanız mümkün olmayabilir. AsynchTask'ı çıkarırsanız ve yürütmeyi aşağıdaki gibi uygularsanız, hala başarısız olur mu? Bir istisnanın infaz edilmesi mümkün mü?

public void execute(final long id, final Callback<DataEntry> callback) { 
     DataEntry dataEntry = mDataEntryRepository.getEntry(id); 
     if (dataEntry != null) { 
      callback.onResult(dataEntry); 
     } else { 
      callback.onError("TODO", null); 
     } 
    } 
+0

Bu sınama, AsyncTask olmadan çalışır (eşzamanlı çağrıyı eşzamanlı aramayı eşzamansız olana yapmak için kodu ayrı bir iş parçacığında etkin olarak çalıştırır). Ancak, başarı testi aynı API kullanıyor ve işe yarıyor, o zaman neden başarısızlık testi için çalışmıyor? Yukarıda belirttiğim gibi, 2L değeri için bir nesne döndürmek için depo ile alay etmem gerekirse, sınama havuzu çağırır ve onError (beklendiği gibi) çağrılmadığı için başarısız olur, dolayısıyla 2L için bir dönüş değeri tanımlamıyor gibi görünüyor. sorunla ilgili. – Francesc

+0

Bunu hata ayıklayabilirsiniz? Benim en iyi iki tahminim yanlış bir örnek üzerinde tartışıyor (çıktı aldığınızı düşünerek "Aslında, bu sahte ile sıfır etkileşimler vardı.") Veya gerçekten çağrılmadığı (bir hata veya istisna nedeniyle). SSCCE'm için geçer. – birkner

+0

mRepository'ün dönüş değeri.getEntry (2), "mRepository.getEntry (2);" çağrılmadı. – birkner