Estoy tratando de seguir esta documentación aquí sobre cómo probar unitariamente un flujo de PagingData en el que está aplicando transformaciones. El código que estoy usando es similar:
@ExperimentalCoroutinesApi @Test fun testGetFooBarsPaged(): Unit = runTest { val differ = AsyncPagingDataDiffer( object : DiffUtil.ItemCallback<FooBar>() { override fun areItemsTheSame(oldItem: FooBar, newItem: FooBar) = false override fun areContentsTheSame(oldItem: FooBar, newItem: FooBar) = false }, object : ListUpdateCallback { override fun onChanged(position: Int, count: Int, payload: Any?) {} override fun onMoved(fromPosition: Int, toPosition: Int) {} override fun onInserted(position: Int, count: Int) {} override fun onRemoved(position: Int, count: Int) {} } ) val pagingData = fooBarsSdk.getFooBarsPaged(FooBar.Type, pageSize = 1).first() differ.submitData(PagingData.from(listOf(FooBar(), FooBar(), FooBar()))) }Las últimas dos líneas en la prueba aquí se ejecutan y la prueba termina con éxito:
El problema es cuando intento enviar la instancia de PagingData que tomé del flujo al objeto AsyncPagingDataDiffer: differ.submitData(pagingData) . Esta invocación se bloquea hasta que runTest() supera el tiempo de espera después de 60 segundos. Mi pregunta es, ¿por qué sucedería eso?
El objeto Pager y el flujo se crean así:
Pager( config = PagingConfig(pageSize), initialKey = null, pagingSourceFactory = factory.asPagingSourceFactory(Dispatchers.Default) ).flow.map { pagingData -> pagingData.map { fooBarEntity -> fooBarEntity.toFooBar() } }donde la fábrica de fuentes de datos se recupera de un método Room Dao como este:
@Query("SELECT DISTINCT * FROM foobars WHERE type = :type") fun getAllFooBarsByTypeLive(type: String): DataSource.Factory<Int, FooBarEntity>los siguientes trabajos aquí:
val job = launch { val pagingData = Pager( config = PagingConfig(20), initialKey = null, pagingSourceFactory = db.fooBarDao().getAllFooBarsByTypeLive("test") .asPagingSourceFactory() ).flow.map { pagingData -> pagingData.map { fooBarEntity -> fooBarEntity.toFooBar() } } .toList()[2] differ.submitData(pagingData) } job.cancel()Por supuesto, necesito al menos 3 elementos en tu flujo. Cómo probar PagingData de Paging 3
La razón por la cual
val pagingData = fooBarsSdk.getFooBarsPaged(FooBar.Type, pageSize = 1).first() differ.submitData(PagingData.from(listOf(FooBar(), FooBar(), FooBar())))funciona es que está usando "desde" y luego no necesita iniciar, ya que puede leer aquí https://developer.android.com/topic/libraries/architecture/paging/test