В соответствии с documentation неочищенные методы возвращают null. Я хочу протестировать метод, который должен возвращать «null» при некоторых обстоятельствах, однако тест не выполняется с исключением, указывающим, что метод не был вызван.Mockito: значение возвращаемого значения по умолчанию
Это тестовая функция инициализации:
@Before
public void setup() throws Exception {
MockitoAnnotations.initMocks(this);
mDataEntry = getFakeEntry();
when(mRepository.getEntry(1L)).thenReturn(mDataEntry);
mGetEntry = new GetEntryImpl(mRepository);
}
и это не удалось тест:
@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));
}
Выполнить метод вызывает издевались функциональный объект mRepository getEntry (2L), который я ожидал возврат null. Тем не менее, это то, что Mockito говорит мне, когда я запускаю тест:
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.
Я попытался добавления
when(mRepository.getEntry(2L)).thenReturn(null);
функции инициализации, но это не имеет никакого значения. Если я верну правильный объект вместо нуля, тогда тест завершится неудачно, так как функция onError не вызывается (поэтому функция mocked object для значения 2L вызывается, когда я указываю действительное возвращаемое значение).
Как я могу высмеять объект null для набора значений?
Edit:
вот код функции испытываемого:
@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);
}
}
});
}
и для справки, тест успех работы:
@SuppressWarnings("unchecked")
@Test
public void testGetEntry_success() throws Exception {
mGetEntry.execute(1L, mCallback);
verify(mRepository).getEntry(eq(1L));
verify(mCallback).onResult(eq(mDataEntry));
}
Вы не можете сделать метод return null, если он никогда не вызывается. Вопрос, который вы должны задать себе, - это почему 'execute()' не вызывает 'getEntry()' или какой-либо другой метод 'mRepository' во время теста. Вы не разместили код для 'execute()', поэтому никто не знает ответа. –
Метод вызывается, если я высмеиваю значение для 2L, возвращая действительный объект, поэтому дело не в том, почему оно не вызывается. – Francesc