如何对分页 3(PagingSource)进行单元测试?

MR3*_*3YY 16 android android-paging-library

Google 最近宣布了新的 Paging 3 库、Kotlin-first 库、对协程和 Flow 的支持等。

我玩过他们提供的代码实验室,但似乎还没有任何测试支持,我还检查了文档。他们没有提到任何关于测试的内容,所以例如我想对这个 PagingSource 进行单元测试:

 class GithubPagingSource(private val service: GithubService,
                     private val query: String) : PagingSource<Int, Repo>() {

override suspend fun load(params: LoadParams<Int>): LoadResult<Int, Repo> {
    //params.key is null in loading first page in that case we would use constant GITHUB_STARTING_PAGE_INDEX
    val position = params.key ?: GITHUB_STARTING_PAGE_INDEX
    val apiQuery = query + IN_QUALIFIER
    return try {
        val response = service.searchRepos(apiQuery, position, params.loadSize)
        val data = response.items
        LoadResult.Page(
                        data,
                        if (position == GITHUB_STARTING_PAGE_INDEX) null else position - 1,
                        if (data.isEmpty()) null else position + 1)
    }catch (IOEx: IOException){
        Log.d("GithubPagingSource", "Failed to load pages, IO Exception: ${IOEx.message}")
        LoadResult.Error(IOEx)
    }catch (httpEx: HttpException){
        Log.d("GithubPagingSource", "Failed to load pages, http Exception code: ${httpEx.code()}")
        LoadResult.Error(httpEx)
    }
  }
}  
Run Code Online (Sandbox Code Playgroud)

那么,我该如何测试这个,有人可以帮助我吗?

Ada*_*itz -3

Kotlin 协程流程

您可以使用 JUnit 本地测试并设置TestCoroutineDispatcher测试运行之前和之后。然后,调用发出 Kotlin Flow 的方法,PagingSource在本地测试环境中观察结果数据,与您的预期进行比较。

不需要 JUnit 5 测试扩展。只需在每次测试之前和之后设置和清除调度程序,即可观察测试环境中的协程与 Android 系统上的协程。

@ExperimentalCoroutinesApi
class FeedViewTestExtension : BeforeEachCallback, AfterEachCallback, ParameterResolver {

    override fun beforeEach(context: ExtensionContext?) {
        // Set TestCoroutineDispatcher.
        Dispatchers.setMain(context?.root
                ?.getStore(TEST_COROUTINE_DISPATCHER_NAMESPACE)
                ?.get(TEST_COROUTINE_DISPATCHER_KEY, TestCoroutineDispatcher::class.java)!!)
    }

    override fun afterEach(context: ExtensionContext?) {
        // Reset TestCoroutineDispatcher.
        Dispatchers.resetMain()
        context?.root
                ?.getStore(TEST_COROUTINE_DISPATCHER_NAMESPACE)
                ?.get(TEST_COROUTINE_DISPATCHER_KEY, TestCoroutineDispatcher::class.java)!!
                .cleanupTestCoroutines()
        context.root
                ?.getStore(TEST_COROUTINE_SCOPE_NAMESPACE)
                ?.get(TEST_COROUTINE_SCOPE_KEY, TestCoroutineScope::class.java)!!
                .cleanupTestCoroutines()
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

您可以在app/src/test/java/app/coinverse/feedViewModel/FeedViewTest下的 Paging 2 Coinverse 示例应用程序中查看本地 JUnit 5 测试。

Paging 3 的区别在于您不需要设置 LiveData 执行器,因为 Kotlin Flow 可以返回PagingData