【发布时间】:2022-02-18 01:58:56
【问题描述】:
稍后编辑
我最终得到了我的 api 服务方法 suspended 并按照 @LordRaydenMK 的建议重构了我的代码。
首先使用库ru.gildor.coroutines:kotlin-coroutines-retrofit的原因纯粹是为了方便并且它是在retrofit发布支持协程的版本之前。
原始问题
我已经尝试了几天来模拟 API 调用,但没有成功。我正在使用以下库:
-
retrofit- 我想我们都熟悉它 -
ru.gildor.coroutines:kotlin-coroutines-retrofit- 一些有用的协程扩展 -
io.mockk:mockk- 用于嘲笑
这是一个模拟 API 响应的简单案例
interface ApiService {
@GET
fun getMyData(@Header("x-value") myValue: String): Call<String>
}
class Usecase(api: ApiService) {
suspend fun execute() {
val result = api.getMyData(value: String).awaitResult()
// do smth with that result for now just return it
return (result as Result.Ok).value
}
}
class UseCaseTest {
private val api = mockk<ApiService>()
@Test
fun testApiCall() {
coEvery { api.getMyData(any()) } returns CallTest.buildSuccess("you did it!")
val result = useCase.execute()
assertEquals(result, "you did it!")
}
}
在上面的示例中,测试挂在 awaitResult 扩展方法上。
到目前为止我所尝试的都没有运气:
- mockkStatic(ru.gildor.coroutines.retrofit.CallAwait) 但没有成功
- 模拟
Call<String>并做一个coEvery { mockedCall.awaitResult() } returns ....
我确信我错过了一些简单的东西,一双新鲜的眼睛会在一英里外发现它。
【问题讨论】:
标签: unit-testing kotlin kotlin-coroutines mockk