【问题标题】:How to write unit tests for paging library in android如何在android中为分页库编写单元测试
【发布时间】:2023-02-03 12:19:15
【问题描述】:

我需要编写单元测试来执行分页网络请求。首先,我实现了分页库逻辑来检索数据。 我创建了一个数据源类和一个存储库类来从网络请求中获取数据。

这是我的数据源类

class ListDataSource(
private val networkService: NetworkService,
private val searchKey: String) : PagingSource<Int, ListItem>() {

override fun getRefreshKey(state: PagingState<Int, ListItem>): Int? {
    return state.anchorPosition?.let { anchorPosition ->
        state.closestPageToPosition(anchorPosition)?.prevKey?.plus(1)
            ?: state.closestPageToPosition(anchorPosition)?.nextKey?.minus(1)
    }
}

override suspend fun load(params: LoadParams<Int>): LoadResult<Int, ListItem> {
    val pageNumber: Int = params.key ?: 0
    return try {
        val response = networkService.getList(
            searchTerm = searchKey,
            page = pageNumber,
            size = 30
        )

        val listItems = response.response?.list
        val nextKey = listItems?.let { nonNullList ->
            if (nonNullList.size < 30) {
                null
            } else {
                pageNumber + 1
            }
        } ?: run {
            null
        }

        LoadResult.Page(
            data = listItems.orEmpty(),
            prevKey = if (pageNumber == 0) null else pageNumber - 1,
            nextKey = nextKey
        )
    } catch (exception: Exception) {
        LoadResult.Error(exception)
    }
}}

这是我的存储库类

class ListPagingRepository(private val service: NetworkService) {

private lateinit var pager: Pager<Int, ListItem>
private lateinit var pagingSource: ListDataSource

fun getListPager(): Pager<Int, ListItem> {
    return pager
}

fun isPagerInitialized(): Boolean = this::pager.isInitialized

fun createSource(searchTerm: String) {
    pagingSource = ListDataSource(service, searchTerm)
}

fun createPager() {
    pager = Pager(
        config = PagingConfig(
            initialLoadSize = 15,
            pageSize = 15,
            enablePlaceholders = false,
            prefetchDistance = 2
        ),
        pagingSourceFactory = { pagingSource }
    )
}}

在我的视图模型中,我进行网络调用的功能是:

fun getPaginatedList(searchTerm: String): Flow<PagingData<ListItem>> {
    listPagingRepository.createSource(searchTerm)
    listPagingRepository.createPager()

    return if (listPagingRepository.isPagerInitialized()) {
        listPagingRepository
            .getListPager()
            .flow
            .cachedIn(viewModelScope)
            .map { pagingData -> pagingData.map { listMapper.map(it) } }
    } else emptyFlow()
}

我如何测试这个网络请求? 搜索了 2 天,但我发现没有任何帮助。

【问题讨论】:

    标签: android kotlin android-paging-3 android-unit-testing


    【解决方案1】:

    您应该使用模拟的网络响应来测试您的实现。使用 MockK 作为模拟框架的此类测试示例:

    @Test
    fun `verify error return from load() when a (types of responses you expect to potentially receive) response is returned` () = runTest {
       
        val mockNetworkService = mockk<NetworkService>(relaxed = true, relaxedUnitFun = true)
       
        val testParams = LoadParams(1, false)
       
        every { mockNetworkService.getList(any(), any(), any()) } returns LoadResponse.Error(YourExpectedException)
       
        val result = ListDataSource(mockNetworkService, "test search").load(testParams)
    
        assertEquals(LoadResponse.Error(YourExpectedException), result)
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 2012-01-06
      • 2019-03-17
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多