Mock server which handles HTTP request is useful component for testing HTTP client library. Since it emulates the handling logic of HTTP request artificially, we can verify our HTTP client without relying external service.

If you write your application in Scala, I’ll recommend to use WireMock for mock server. This is easy to use and flexible. We are able to integrate it with ScalaTest.

The usage is written here. But it’s the tutorial for Java. I want to write the mock server code in Scala.

import org.scalatest.FlatSpec
import org.scalatest.BeforeAndAfterEach
import org.json4s.native.Serialization

class MyTest extends FlatSpec with BeforeAndAfterEach {
  private val port = 8080
  private val hostname = "localhost"
  // Run wiremock server on local machine with specified port.
  private val wireMockServer = new WireMockServer(wireMockConfig().port(port))

  override def beforeEach {
    wireMockServer.start()
  }

  override def afterEach {
    wireMockServer.stop()
  }

  val response = Map(
      "k1" -> "v1",
      "k2" -> "v2"
  )

  "Your Client" should {
    "send proper request" in {
      val path = s"/v1/some/api"
      // Configure mock server stub response
      // json4s is useful to constructing response string if the response is JSON
      wireMockServer.stubFor(
        get(urlPathEqualTo(path))
        .willReturn(aResponse()
        .withHeader("Content-Type", "application/json")
        .withBody(Serialization.write(response))
        .withStatus(200)))

      // Send request by using your HTTP client
      val ret = youClient.get()

      // Verify the request is valid
      wireMockServer.verify(
        getRequestedFor(urlPathEqualTo(path))
        .withHeader("Content-Type", "application/json"))
      }

      // Assert response body itself if necessary
    }
  }
}

That’s all. WireMock provides StringValuePattern for filtering/matching HTTP request. (e.g. equalTo, containing) By using the class, you can create stub/mock server flexibly.