可以使用 MockWebServer 模拟后端 API 请求,然后在测试中使用 PagingData.test()
来检查 ViewModel 是否正确收集到数据。以下是示例代码:
@RunWith(AndroidJUnit4::class)
class MyViewModelTest {
private lateinit var viewModel: MyViewModel
private val mockWebServer = MockWebServer()
@Before
fun setup() {
mockWebServer.start()
val api = Retrofit.Builder()
.baseUrl(mockWebServer.url("/"))
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(MyApi::class.java)
// 创建 DataSourceFactory
val dataSourceFactory = object : DataSource.Factory<Int, MyData>() {
override fun create(): DataSource<Int, MyData> {
return MyDataSource(api)
}
}
// 创建 RemoteMediator
val remoteMediator = object : RemoteMediator<Int, MyData>() {
override suspend fun load(
loadType: LoadType,
state: PagingState<Int, MyData>
): MediatorResult {
// 发起网络请求
val response = api.getData()
// 将响应转换成 MyData 列表
val data = response.body()!!.map {
MyData(it)
}
// 将数据保存到数据库中
database.myDao().insert(data)
// 返回接收到的数据的 MediatorResult
return MediatorResult.Success(endOfPaginationReached = data.isEmpty())
}
}
// 创建 Pager 对象
val pager = Pager(
config = PagingConfig(pageSize = 20),
remoteMediator = remoteMediator,
pagingSourceFactory = dataSourceFactory
)
viewModel = MyViewModel(pager)
}
@After
fun tearDown() {
mockWebServer.shutdown()
}
@Test
fun testMyViewModel() {
// 创建 MockWebServer 的响应
val response = MockResponse()
.setResponseCode(200)
.setBody(Gson().toJson(listOf(MyDataResponse("data1"), MyDataResponse("data2"))))
mockWebServer.enqueue(response)
// 手动触发