如何对从Paging3返回PagingSource的RoomDao查询进行单元测试
我的问题实际上很笼统。我想知道如何对从Paging 3返回PagingSource的Room 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(...))
}
THE END
二维码