【问题标题】:How to test Retrofit API call using MockWebServer如何使用 MockWebServer 测试 Retrofit API 调用
【发布时间】:2021-06-15 22:15:06
【问题描述】:

我有一个以非常基本的方式创建 RetrofitInstance 的类,我想通过对 mockedWebServer 运行虚拟 api 来测试它是否正常工作,但由于某种原因,我没有获得成功的 200 响应,而是得到 0 .

fun createRetrofitInstance(baseUrl: String, client: OkHttpClient): Retrofit {

        return Retrofit.Builder().baseUrl(baseUrl)
                .addCallAdapterFactory(callAdapterFactory)
                .addConverterFactory(converterFactory)
                .client(client)
                .build()
}

我想使用 DummyApi 对其进行测试

@Test
    fun `should return successful response`() {
        val mockedWebServer = MockWebServer()
        val mockedResponse = MockResponse().setResponseCode(200)
        mockedWebServer.enqueue(mockedResponse)
        mockedWebServer.start()
        mockedWebServer.url("/")

        val retrofit = tested.createRetrofitInstance(mockedWebServer.url("/").toString(), client)
        val testApi = retrofit.create(TestApi::class.java)

        val actualResponseCall: Call<Any> = testApi.getTestApi()
        assertEquals(200, actualResponseCall.execute().code())
        
        mockedWebServer.shutdown()
    } 

虚拟接口

interface TestApi { 
    @GET("/")
    fun getTestApi() : Call<Any>
}

【问题讨论】:

    标签: android kotlin testing retrofit okhttp


    【解决方案1】:

    您应该通读 MockWebServer 上的优秀教程之一。仅此答案的信息太多。我认为在这种情况下你只是错过了setBody 电话。

    https://medium.com/android-news/unit-test-api-calls-with-mockwebserver-d4fab11de847

    val mockedResponse = MockResponse()
    mockedResponse.setResponseCode(200)
    mockedResponse.setBody("{}") // sample JSON
    

    【讨论】:

    • 我认为 .setBody(...) 是可选的,但实际上它是必需的,并帮助我修复了测试。我认为建议的教程没有帮助,因为它没有维护,并且那里缺少部分代码,但确实谢谢。
    • 那里有很多,我只是选择了我找到的第一个来获取一些工作示例代码。我很高兴它有所帮助。
    猜你喜欢
    • 2015-11-29
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    相关资源
    最近更新 更多