Ir al contenido principal
Versión: 6.1

MockServer

[Traducción Beta No Oficial]

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Kotest ofrece una extensión para integrarse con la biblioteca MockServer.

nota

Requiere añadir el módulo io.kotest:kotest-extensions-mockserver a tu configuración de compilación.

nota

Desde Kotest 6.0, todas las extensiones se publican bajo el grupo io.kotest, con una cadencia de versiones vinculada a los lanzamientos principales de Kotest.

MockServer permite definir un servidor HTTP en proceso con rutas predefinidas para realizar pruebas.

Para usar en Kotest, instalamos una instancia de MockServerExtension en la especificación (spec) bajo prueba, y Kotest controlará el ciclo de vida automáticamente.

Luego simplemente usamos MockServerClient para configurar las respuestas.

Por ejemplo:

class MyMockServerTest : FunSpec() {
init {

// this attaches the server to the lifeycle of the spec
install(MockServerExtension(1080))

// we can use the client to create routes. Here we are setting them up
// before each test by using the beforeTest callback.
beforeTest {
MockServerClient("localhost", 1080).`when`(
HttpRequest.request()
.withMethod("POST")
.withPath("/login")
.withHeader("Content-Type", "application/json")
.withBody("""{"username": "foo", "password": "bar"}""")
).respond(
HttpResponse.response()
.withStatusCode(202)
.withHeader("X-Test", "foo")
)
}

// this test will confirm the endpoint works
test("login endpoint should accept username and password json") {

// using the ktor client to send requests
val client = HttpClient(CIO)
val resp = client.post<io.ktor.client.statement.HttpResponse>("http://localhost:1080/login") {
contentType(ContentType.Application.Json)
body = """{"username": "foo", "password": "bar"}"""
}

// these handy matchers come from the kotest-assertions-ktor module
resp.shouldHaveStatus(HttpStatusCode.Accepted)
resp.shouldHaveHeader("X-Test", "foo")
}
}
}

En este ejemplo obviamente solo probamos el mock, pero ilustra cómo configurar pruebas reales. Por ejemplo, podrías tener un cliente de API para probar: configurarías las rutas de API con MockServer, invocarías métodos en tu cliente y verificarías que maneja correctamente las respuestas.

Puertos dinámicos

Al usar MockServerExtension, puedes especificar uno o varios puertos si quieres fijarlos manualmente. En caso contrario, puedes no especificarlos en absoluto, y Kotest asignará automáticamente un puerto libre para que el servidor se ejecute. Posteriormente, puedes usar la instancia del servidor devuelta por la función de instalación para obtener el puerto asignado.

Aquí tienes un ejemplo de uso de puertos dinámicos:

class MyMockServerTest : FunSpec() {
init {

val server = install(MockServerExtension())

beforeTest {
MockServerClient("localhost", server.port).`when`(
HttpRequest.request()
.withMethod("GET")
.withPath("/v")
).respond(
HttpResponse.response()
.withStatusCode(200)
)
}

test("test /health returns 200") {

val client = HttpClient(CIO)
val resp = client.post<io.ktor.client.statement.HttpResponse>("http://localhost:${healthcheck.port}/health")
resp.shouldHaveStatus(HttpStatusCode.OK)
}
}
}