在Android单元测试中,检查PagingData对象数据的正确方法是什么

在Android单元测试中,检查PagingData对象数据的正确方法是什么,android,unit-testing,android-paging,Android,Unit Testing,Android Paging,我使用分页库从api中检索数据并在列表中显示它们 为此,我在我的存储库中创建了以下方法: fun getArticleList(查询:字符串):流 在我的viewmodel中,我创建了如下搜索方法: override fun search(query: String) { val lastResult = articleFlow if (query == lastQuery && lastResult != null) return las

我使用分页库从api中检索数据并在列表中显示它们

为此,我在我的存储库中创建了以下方法:

fun getArticleList(查询:字符串):流

在我的viewmodel中,我创建了如下搜索方法:

override fun search(query: String) {
    val lastResult = articleFlow
    if (query == lastQuery && lastResult != null)
        return
    lastQuery = query
    searchJob?.cancel()
    searchJob = launch {
        val newResult: Flow<PagingData<ArticleList>> = repo.getArticleList(query)
            .map {
                it.insertSeparators { //code to add separators }.cachedIn(this)
        articleFlow = newResult
        newResult.collectLatest {
            articleList.postValue(it)
        }
    }
}
它似乎可以工作,但基于标记为
@RestrictTo(RestrictTo.Scope.LIBRARY\u GROUP)
PagingDataDifference
类,因此将来可能无法工作


有没有更好的方法从PagingData(在库中标记为internal)获取
,或者从中获取实际数据?

我对Paging3库也有同样的问题,并且还没有很多关于这个库的在线讨论,但是当我翻阅一些文档时,我可能会找到一个解决方案。我面临的场景是试图确定
分页数据中的数据列表是否为空,然后我将在此基础上操作UI

以下是我在文档中发现的内容,
PagingDataAdapter
中有两个API,它们被添加到版本中,即
peek()
,和
snapshot()
peek()
根据索引为我们提供了一个特定的列表对象,而
snapshot()
为我们提供了整个列表

下面是我所做的:

lifecycleScope.launch {
    //Your PagingData flow submits the data to your RecyclerView adapter
    viewModel.allConversations.collectLatest {
        adapter.submitData(it)
    }
}
lifecycleScope.launch {
    //Your adapter's loadStateFlow here
    adapter.loadStateFlow.
        distinctUntilChangedBy {
            it.refresh
        }.collect {
            //you get all the data here
            val list = adapter.snapshot()
            ...
        }
    }

由于我最近刚刚接触到分页库和
Flow
,这种方法可能存在缺陷,请告诉我是否有更好的方法

我同意王子建的观点,测试它的唯一方法是通过快照

这只在有活动的internet连接时有效。

您的方法似乎适用于实际代码,我有类似的设置(只有我使用viewmodel保存pageddata的livedata,并在其中内部使用流,而不是公开流本身)但我想做的是在单元测试中测试数据,所以在您的示例中,您将如何测试从viewmodel.allconversations.collectlatest接收到的内容?难道您没有找到解决方案吗?没有,仍然在使用此代码,到目前为止还没有出现故障,所以我猜是这样的staying@Cruces在尝试时,这种方法似乎不再有效要使用扩展名collectData()进行测试,将引发一个异常:在显示新列表后缺少对onListPresentable的调用。如果您看到此异常,通常表明分页存在问题。请提交一个错误,以便我们可以在@ZivKesten just call onListPresentable()修复它在for循环之后。正如我对Zijian所说的,是的,这在实际代码中是有效的,但是我正在运行单元测试,没有lifecyclescope,没有适配器,我没有在它们中运行robolectric来创建这样的对象,它们应该是测试基本功能的普通单元测试
lifecycleScope.launch {
    //Your PagingData flow submits the data to your RecyclerView adapter
    viewModel.allConversations.collectLatest {
        adapter.submitData(it)
    }
}
lifecycleScope.launch {
    //Your adapter's loadStateFlow here
    adapter.loadStateFlow.
        distinctUntilChangedBy {
            it.refresh
        }.collect {
            //you get all the data here
            val list = adapter.snapshot()
            ...
        }
    }