В настоящее время я занимаюсь рефакторингом устаревшего кода для использования компонентов архитектуры Android и настраиваю запросы базы данных и залпов комнаты в своего рода шаблоне репозитория. Таким образом, уровень представления / домена просит репозиторий заставить LiveData-Objects наблюдать или сказать ему о синхронизации с сервером, после чего старые записи базы данных удаляются, а все текущие записи загружаются с сервера.
Я написал тесты для части синхронизации, поэтому я уверен, что объекты извлекаются и вставляются в базу данных правильно. Но при написании теста для наблюдения за записями этой таблицы db (и проверки правильности сохранения объектов со всем, что нужно сделать, прежде чем помещать их в db) LiveData>, за которым я наблюдаю, не запускается.
В следующем фрагменте кода вы можете предположить, что метод synchronizeFormsWithServer (...) работает правильно и выполняет операции с базой данных асинхронно. Он содержит операции, которые удаляют все объекты формы из базы данных, которых нет в списке форм, полученных с сервера, и вставляют все новые. Поскольку в начале теста база данных пуста, это не имеет большого значения.
Тест, в котором наблюдатель не запускается:
@Test
public void shouldSaveFormsFromServerIntoDb() throws Exception
{
Lifecycle lifecycle = Mockito.mock(Lifecycle.class);
when(lifecycle.getCurrentState()).thenReturn(Lifecycle.State.RESUMED);
LifecycleOwner owner = Mockito.mock(LifecycleOwner.class);
when(owner.getLifecycle()).thenReturn(lifecycle);
final CountDownLatch l = new CountDownLatch(19);
formRepository.allForms().observe(owner, formList ->
{
if (formList != null && formList.isEmpty())
{
for (Form form : formList)
{
testForm(form);
l.countDown();
}
}
});
formRepository.synchronizeFormsWithServer(owner);
l.await(2, TimeUnit.MINUTES);
assertEquals(0, l.getCount());
}
Код FormRepository:
@Override
public LiveData<List<Form>> allForms()
{
return formDatastore.getAllForms();
}
Хранилище данных:
@Override
public LiveData<List<Form>> getAllForms()
{
return database.formDao().getAllForms();
}
Код formDao (база данных реализована так, как вы ожидаете от комнаты):
@Query("SELECT * FROM form")
LiveData<List<Form>> getAllForms();
Вполне возможно, что я чего-то не понимал в компонентах LiveData, потому что я использую их впервые, так что, возможно, я что-то в корне ошибся.
Мы очень ценим любую помощь :)
PS: я наткнулся на ЭТО сообщение, в котором обсуждается аналогичная проблема, но поскольку я в настоящее время вообще не использую DI и использую только один экземпляр formrepository (с которым связан только один экземпляр formDao), я не думаю, что это та же проблема.