稍后編輯
我最終得到了我的 api 服務方法suspended并按照@LordRaydenMK 的建議重構了我的代碼。
首先使用該庫的原因ru.gildor.coroutines:kotlin-coroutines-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 ....
我敢肯定,我錯過了一些簡單的事情,一雙新鮮的眼睛會在一英里外發現它。
uj5u.com熱心網友回復:
第一件事:
getMyData不是一個suspend函式,所以在模擬它時可能不應該使用coEvery它(我不是 Mockk 用戶)。
話雖這么說,Retrofit 確實支持suspend本機功能,所以你可以這樣做:
interface ApiService {
@GET
suspend fun getMyData(@Header("x-value") myValue: String): String
}
awaitResult這意味著在您的用例中不需要。在這種情況下,您coEvery在模擬它時確實需要。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/427123.html
下一篇:如何為CDK階段撰寫Junit
