如何对从Paging3返回PagingSource的RoomDao查询进行单元测试

我的问题实际上很笼统。我想知道如何对从Paging 3返回PagingSourceRoom Dao查询进行单元测试。

我有一个Room Dao查询:

    @Query("SELECT * FROM database")
    fun getChocolateListData(): PagingSource<Int, Chocolate>

我想知道如何对这个查询进行单元测试。

到目前为止我尝试过的(使用内存中的Room数据库进行测试):

@FlowPreview
@Test
fun saveChocolateToDbSavesData() = runBlocking {
    val dao: Dao by inject()

    val chocolate = Chocolate(
        name = "Dove"
    )
    dao.saveChocolate(chocolate) 

    val pagingSourceFactory = { dao.getChocolateListData() }
    val pagingDataFlow: Flow<PagingData<Chocolate>> = Pager(
        config = PagingConfig(
            pageSize = 50,
            maxSize = 200,
            enablePlaceholders = false
        ),
        pagingSourceFactory = pagingSourceFactory
    ).flow

    val chocolateListFlow = pagingDataFlow.testIn(coroutinesTestRule)
    Assert.assertEquals(PagingData.from(listOf(chocolate)), chocolateListFlow.emissions[0])
}

然而,这并没有通过:

junit.framework.AssertionFailedError:预期:androidx.paging.PagingData@7d6c23a1 实际:androidx.paging.PagingData@321123d2

不知道如何做对。任何帮助将不胜感激!

回答

PagingData 是内部事件流的包装器,您不能直接比较它,并且您得到的错误是按预期抛出引用不等式。

相反,您应该PagingSource直接查询以比较数据, LoadResult.Page或者您需要将其连接到演示者 API,例如AsyncPagingDataDifferorPagingDataAdapter并使用.snapshot()

val flow = Pager(..).flow
val adapter = MyPagingDataAdapter()
val job = launch {
    flow.collectLatest { adapter.submitData(it) }
}
// Do your asserts here
job.cancel()

如果你需要一个测试范围,我推荐runBlockingTest来自 kotlinx.coroutines.test 库

PagingSource直接查询,它有一个挂起.load()方法,因此您可以简单地将其包装起来runBlockingTest并断言结果:

@Test
fun test() = runBlockingTest {
  val pagingSource = MyPagingSource()
  val actual = pagingSource.load(LoadParams.Refresh(...))
  assertEquals(actual as? LoadResult.Page)?.data, listOf(...))
}


以上是如何对从Paging3返回PagingSource的RoomDao查询进行单元测试的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>