Mock Retrofit的Call响应失败,如何返回Call对象?
如何在Mock ApiService时返回Call对象?
嘿,我来帮你搞定这个问题!你现在需要Mock ApiService的响应,核心就是要构造一个能正常工作的Call对象对吧?下面给你两种实用的方法,看哪种更适合你的场景:
方法一:手动实现Call接口(无额外依赖,适合简单场景)
既然你已经写了ApiServiceMock类,那可以直接在里面手动构造一个Call的实现,把你预设的响应返回回去。比如:
class ApiServiceMock : ApiService { override fun getStep1User(): Call<UserResponse> { // 1. 构造你想要返回的Mock响应体 val mockUserResponse = UserResponse().apply { setResponse("SomeUserValue") } // 2. 用Retrofit的Response.success()包装成成功响应 val retrofitResponse = Response.success(mockUserResponse) // 3. 返回自定义的Call实现 return object : Call<UserResponse> { // 同步执行时直接返回预设响应 override fun execute(): Response<UserResponse> = retrofitResponse // 异步执行时回调成功(如果测试用到异步的话) override fun enqueue(callback: Callback<UserResponse>) { callback.onResponse(this, retrofitResponse) } // 其他未用到的方法可以空实现或按需处理 override fun isExecuted(): Boolean = false override fun cancel() {} override fun isCanceled(): Boolean = false override fun clone(): Call<UserResponse> = this override fun request(): Request = Request.Builder().url("http://mock.api").build() } } }
这样你的测试代码就能正常调用call.execute()拿到预设的响应了。
方法二:用Mockito简化Mock(减少样板代码,适合复杂接口)
如果你的ApiService有很多方法,手动写Mock类会很繁琐,用Mockito可以大大简化这个过程。首先确保你已经添加了Mockito的依赖,然后修改测试代码如下:
@RunWith(AndroidJUnit4::class) class ApiServiceTest { @Test fun testSomething() { // 1. 构造Mock响应体 val mockUserResponse = UserResponse().apply { setResponse("SomeUserValue") } val retrofitResponse = Response.success(mockUserResponse) // 2. Mock Call对象,预设execute()的返回值 val mockCall = mock(Call::class.java) as Call<UserResponse> `when`(mockCall.execute()).thenReturn(retrofitResponse) // 3. Mock ApiService接口,预设getStep1User()返回上面的mockCall val apiService = mock(ApiService::class.java) `when`(apiService.getStep1User()).thenReturn(mockCall) // 4. 执行测试断言 val call = apiService.getStep1User() val result = call.execute() Assert.assertEquals("SomeUserValue", result.body()!!.getResponse()) } }
这种方法不需要自己写ApiServiceMock类,直接在测试里动态Mock接口和Call对象,代码更简洁。
额外提示
- 如果要测试错误场景(比如HTTP 404、500),可以用
Response.error()来构造失败的响应,比如:val errorResponse = Response.error<UserResponse>(404, ResponseBody.create(null, "Not Found")) - 确保
UserResponse的类型和ApiService接口中getStep1User()返回的Call<T>的泛型一致,避免类型转换错误。
内容的提问来源于stack exchange,提问作者Jim Clermonts
相关产品推荐
相关产品推荐

