【发布时间】:2018-02-09 02:21:10
【问题描述】:
我目前正在重构遗留代码以使用 Android 架构组件,并在一种存储库模式中设置房间数据库和 volley 请求。 因此表示层/域层要求存储库获取 LiveData-Objects 以观察或告诉他与服务器同步,之后删除旧的数据库条目并从服务器重新获取所有当前条目。
我已经为同步部分编写了测试,所以我确信对象被正确地提取并插入到数据库中。但是,在编写测试以观察该数据库表的条目时(并测试对象是否正确保存以及在将它们放入数据库之前需要完成的所有操作)我正在观察的 LiveData> 不会被触发。
在下面的 sn-p 中,您可以假设 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-Components 有一些了解,因为这是我第一次使用它们,所以我可能从根本上搞错了。
非常感谢您的每一点帮助:)
PS:我偶然发现了THIS 帖子,它讨论了一个类似的问题,但是由于我目前根本没有使用 DI,而只使用了一个 formrepository 实例(它只关联了一个 formDao 实例)我不要认为这是同一个问题。
【问题讨论】:
标签: android observable android-room android-architecture-components android-livedata