Google最近宣布了新的Paging 3库,Kotlin第一库,支持协同程序和流...等等。
我尝试了他们提供的codelab,但是似乎还没有任何测试支持,我也检查了documentation。他们没有提到任何关于测试的东西,所以举个例子,我想对这个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)
}
}
}
那么,我怎么才能测试这个,是任何人都可以帮助我??
6条答案
按热度按时间wz8daaqr1#
我最近也有类似的经历,发现分页库并不是真的设计成可测试的,我相信Google会在它成为一个更成熟的库后使它更易于测试。
我能够为
PagingSource
编写一个测试,我使用了RxJava 3插件和mockito-kotlin,但是测试的总体思路应该可以用API的Coroutines版本和大多数测试框架重现。它并不完美,因为
verify(onSuccess).accept(LoadResult.Page(itemList, null, 2))
依赖于LoadResult.Page
是data class
,这可以通过它的属性值进行比较,但是它确实测试了PagingSource
。bd1hkmkf2#
使用AsyncPagingDataDiffer可以实现这一点
步骤1.创建DiffCallback
步骤2.创建ListCallback
步骤3.向差异提交数据并进行屏幕截图
文件https://developer.android.com/reference/kotlin/androidx/paging/AsyncPagingDataDiffer
2ic8powd3#
我有解决方案,但我不认为这是分页v3测试的好主意。我的分页v3的所有测试是在仪器测试上工作,而不是本地单元测试,这是因为如果我把同样的方法放在本地测试中(也用robolectrict),它仍然不起作用。
这是我的测试用例,我使用mockwebserver模拟和计算网络请求,这些请求必须与我的预期请求相等
请继续:)
vql8enpb4#
我刚刚遇到了同样的问题,这里是answer:
步骤1是创建一个模拟。
第二步是对
PageSource
的核心方法load
方法进行单元测试:rqqzpn5f5#
新的分页测试API刚刚发布,通过将分页的输出作为基本的
List
读取,使“作为状态”测试PagingSources成为可能。主要有两种API:
List<Value>
() -> PagingSource<Value>
每种方法都有不同的用例。第一种方法通常用于Assert业务逻辑状态保持器的输出,通常是AAC ViewModel。第二种方法用于可以传递给
ViewModel
的fakes,使您可以单独在UI层中对分页集成进行单元测试,而不必依赖数据层中的实际PagingSource
实现。pkmbmrz76#
Kotlin协同程序流程
您可以在测试运行之前和之后使用JUnit本地测试和set the
TestCoroutineDispatcher
,然后调用PagingSource
发出Kotlin流的方法,在本地测试环境中观察结果数据,并与预期进行比较。JUnit 5测试扩展不是必需的,只需要在每次测试之前和之后设置和清除调度器,以便观察测试环境中的协同程序与Android系统上的协同程序。
您可以在Coinverse sample app中的 app/src/test/java/app/coinverse/feedViewModel/FeedViewTest 下查看分页2的本地JUnit 5测试。
分页3的不同之处在于,您不需要设置LiveData执行器,因为KotlinFlow可以返回
PagingData
。