SireMock
SireMock is a Scala wrapper for WireMock, which is a HTTP simulator that runs on the JVM. The main idea of SireMock is to provide a more friendly api for Scala.
Setup
If you want to start with SireMock, first you need to add the dependency:
//works for both Scala 2.12 and 2.13
resolvers += "gabfssilva releases" at "http://dl.bintray.com/gabfssilva/maven"
libraryDependencies += "io.github.gabfssilva" %% "siremock" % "1.0.2" % "test"
Also, you need to instantiate WireMock to start with SireMock.
This is an example using Scalatest:
class MockFeatures extends FeatureSpec with Matchers with BeforeAndAfter with SireMockServer {
private val port = 8183
override val wireMockServer: WireMockServer = new WireMockServer(port)
before {
startWireMock()
}
after {
resetWireMock()
stopWireMock()
}
//tests here
}
If you want to run WireMock as client, you can also use the SireMockClient trait:
class MockFeatures extends FeatureSpec with Matchers with BeforeAndAfter with SireMockClient {
private val port = 8183
override val wireMockClient: WireMock = new WireMock("localhost", port)
after {
resetWireMock()
}
//tests here
}
Stubbing
SireMock provides much better Scala-like DSL for you to work with WireMock.
The basic syntax is:
(request) respond (response)
You can construct your request and response mappings as builders:
(on(urlEqualTo("/hello")) get) respond (aResponse withBody "hello, world!")
This is a complex example to show what you can do with the DSL:
(((on(urlEqualTo("/hello")) post)
withAuth BasicAuth("test", "test")
withContentType "application/json"
withBody equalToJson("""{ "hello": "world!" }""")
withHeaders ("X-My-Header" -> equalTo("MyHeaderValue"), "X-My-Other-Header" -> equalTo("MyHeaderValue2")))
respond (
aResponse
withContentType "application/json"
withStatus 201
withBody expectedResponseBody
withHeaders("X-My-Header-Response" -> "MyHeaderValueResponse")
withDelay(2 seconds)
)
)
Verifying
While HTTP stubbing satisfies most needs, sometimes we want to assure that a certain request as made.
Different from WireMock, SireMock lets you match the same request object you created for stubbing your services:
val request = on(urlEqualTo("/hello")) get
request respond (aResponse withBody "hello, world!")
verify(request) wasCalled exactly(1)
Besides exactly
, you can also use lessThan
, lessThanOrExactly
, moreThanOrExactly
and moreThan
.
Stateful behavior
You can use the Scenario
feature from WireMock using the Scenario
SireMock object while building your request:
val helloWorldScenario = Scenario("hello, world")
(((on(urlEqualTo("/hello")) get) in (helloWorldScenario settingStateTo "once"))
respond (
aResponse withBody """{"hello":"world-1"}"""
)
)
(((on(urlEqualTo("/hello")) get) in (helloWorldScenario whenStateIs "once"))
respond (
aResponse withBody """{"hello":"world-2"}"""
)
)
How can I help?
New PRs and new feature requests are very welcome, so, if you want to help with a new feature, create a new issue or send a PR.
License
This project is licensed under the MIT License - see the LICENSE.md file for details