Search code examples
kotlinhttpresponsektor

How to create an HttpResponse object with dummy values in ktor Kotlin?


I am using ktor for developing a microservice in Kotlin. For testing a method, I need to create a dummy HttpResponse (io.ktor.client.statement.HttpResponse to be specific) object with status = 200 and body = some json data.
Any idea how I can create it?


Solution

  • You can use mockk or a similar kind of library to mock an HttpResponse. Unfortunately, this is complicated because HttpRequest, HttpResponse, and HttpClient objects are tightly coupled with the HttpClientCall. Here is an example of how you can do that:

    val call = mockk<HttpClientCall> {
        every { client } returns mockk {}
        coEvery { receive(io.ktor.util.reflect.typeInfo<String>()) } returns "body"
        every { coroutineContext } returns EmptyCoroutineContext
        every { attributes } returns Attributes()
        every { request } returns object : HttpRequest {
            override val call: HttpClientCall = this@mockk
            override val attributes: Attributes = Attributes()
            override val content: OutgoingContent = object : OutgoingContent.NoContent() {}
            override val headers: Headers = Headers.Empty
            override val method: HttpMethod = HttpMethod.Get
            override val url: Url = Url("/")
        }
    
        every { response } returns object : HttpResponse() {
            override val call: HttpClientCall = this@mockk
            override val content: ByteReadChannel = ByteReadChannel("body")
            override val coroutineContext: CoroutineContext = EmptyCoroutineContext
            override val headers: Headers = Headers.Empty
            override val requestTime: GMTDate = GMTDate.START
            override val responseTime: GMTDate = GMTDate.START
            override val status: HttpStatusCode = HttpStatusCode.OK
            override val version: HttpProtocolVersion = HttpProtocolVersion.HTTP_1_1
        }
    }
    
    val response = call.response