Kotest 모의 서버(MockServer)

MockServer는 가상의 HTTP 서버를 제공해준다. 이 라이브러리를 사용하면 별도로 Mocking 라이브러리(mockk 등)를 사용하지 않고 실제 서버와 통신하는 것과 같이 테스트를 수행할 수 있다.

Kotest는 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