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));
}
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. –
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