unit-testing - 在Kotlin中模拟http响应

标签 unit-testing mocking jvm kotlin

目前,我正在从事一项业余项目,我想学习一些有关Kotlin的知识。
我实现了一个对象,该对象发出HTTP获取请求并从响应中返回Json对象。
我正在努力的是在测试中模拟响应或http框架。

我认为,如果框架将提供一个类,则可以管理模拟。但是由于它仅提供类似khttp.get()的功能,因此我对如何模拟它有些困惑。

有人能帮助我吗? :)
谢谢!

HTTPClient类:

package dao.http.HTTPClient
import khttp.get
import org.json.JSONObject
import java.net.URLDecoder

class HTTPClient {
  fun getClient(): HTTPClient {
    return this
  }

  fun httpRequestGET(url: String): JSONObject {
    val r = get(url)
    return r.jsonObject
  }
}

和相关的考试类
import dao.http.HTTPClient
import io.mockk.every
import io.mockk.spyk
import org.hamcrest.MatcherAssert.assertThat
import org.json.JSONObject
import org.junit.jupiter.api.Test
import org.hamcrest.CoreMatchers.`is` as Is
import khttp.responses.GenericResponse

class HTTPClientTest  {

    @Test
    fun testHTTPRequestGET() {
        val http_get = spyk(khttp.get( "https://somepage.com/wp-json/tsapi/v1/user/ts/isregistered/12323"))
        val httpClient = HTTPClient()

        var expectedAnswer: JSONObject = JSONObject("""{"uid":"1","user":"user","is_registered":"true"}""")
        every { http_get } returns GenericResponse()

        var url = "https://somepage.com/wp-json/tsapi/v1/user/ts/isregistered/12323"

        var actualAnswer = httpClient.httpRequestGET(url)

        assertThat(actualAnswer.get("user"), Is(expectedAnswer.get("user")))
    }

}

最佳答案

您可以像这样使用它:

@Test
fun test() {
    mockkStatic("khttp.KHttp")
    verify { khttp.get(any()) }
    verify(exactly = 1) { khttp.get(url = "http://google.com") }
}

关于unit-testing - 在Kotlin中模拟http响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49079218/

相关文章:

java - 原始 Java 的默认类型

c++ - 检查程序是否崩溃

javascript - 在 Javascript 测试中断言对象相等 (chai)

java - 根据给定的参数,JVM 使用多少物理内存?

javascript - 如何模拟浏览器的时区?

testing - 客户端-服务器集成测试 : mock or not?

Android 单元测试不适用于 Android 库项目

android - 如何检查一个方法是否没有被 mockk 调用?

python - 我如何使用 unittest.mock 来消除代码中的副作用?

python - 是否可以使用 python 模拟 C 函数?