Kotest 모의 서버(MockServer)
MockServer는 가상의 HTTP 서버를 제공해준다. 이 라이브러리를 사용하면 별도로 Mocking 라이브러리(mockk 등)를 사용하지 않고 실제 서버와 통신하는 것과 같이 테스트를 수행할 수 있다.
Kotest는 MockServer 라이브러리와의 통합을 위한 확장 기능을 제공한다.
NOTE
빌드에io.kotest.extensions:kotest-extensions-mockserver
모듈을 추가해야 한다.
MockServer
MockServer는 가상의 HTTP 서버를 제공해준다. 이 라이브러리를 사용하면 별도로 Mocking 라이브러리(mockk 등)를 사용하지 않고 실제 서버와 통신하는 것과 같이 테스트를 수행할 수 있다.
Kotest는 MockServer 라이브러리와의 통합을 위한 확장 기능을 제공한다.
의존성 추가
MockServer에 사용하려면 io.kotest.extensions:kotest-extensions-mockserver
모듈을 의존성에 추가해야 한다. 최신 버전은 maven central에서 확인할 수 있다.
testImplementation("io.kotest.extensions:kotest-extensions-mockserver:<version>")
Configuration
모의 서버를 사용하면 테스트하려는 경로에 대해 하드 코딩된 프로세스 중 HTTP 서버를 정의할 수 있다.
Kotest에서 사용하려면 테스트 중인 사양에 MockServerListener 인스턴스를 첨부하면 Kotest가 자동으로 수명 주기를 제어한다.
모의 서버 연결
그런 다음 MockServerClient
를 사용하여 응답을 연결하기만 하면 된다.
예를 들면, 아래와 같다.
class MyMockServerTest : FunSpec() {
init {
// this attaches the server to the lifeycle of the spec
listener(MockServerListener(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")
}
}
}
위의 예에서는 물론 모의 테스트 자체만 테스트하고 있지만 실제 테스트가 어떻게 구성될 수 있는지 보여준다. 예를 들어,, 테스트하려는 API 클라이언트가 있는 경우 모의 서버를 사용하여 API 경로를 구성한 다음 API 클라이언트에서 메서드를 호출하여 응답이 올바르게 처리되는지 확인할 수 있다.
참고
최종 수정 : 2024-04-23