easywebmock
is a wrapper on top of OkHttp's mockwebserver, to provide easy way to mock http server tesing Java projects, especially micro service projects using Spring Boot & kotlin.
// Add jitpack to root build.gradle at the end of repositories
allprojects {
repositories {
...
maven { url 'https://www.jitpack.io' }
}
}
// Add easywebmock to test dependency
dependencies {
testImplementation 'com.github.Wuvist:easywebmock:v1.0.1'
}
MockServerManager
in com.blogwind.easywebmock
package provides access to easywebmock's default mock server instance.
MockServerManager.newServer(name)
to create new instance of mock server other than default instanceMockServerManager.getServer(name)
to get reference of created server instance
.setDefaultResponse(toPath: String, withResponse: MockResponse)
- set default response to path
.setDefaultResponse(toPath: String, withHandler: (RecordedRequest) -> MockResponse)
- set default handler to path
.setDefaultResponse(toPath: String, withString: String, contentType: String = "text/plain")
- set constant string response to path with contentType
setDefaultResponseJson(toPath: String, withObject: Any)
- set default object (serialized to json by jackson-module-kotlin) to path
.setOneTimeResponse
&.setOneTimeResponseJson
methods that similar tosetDefaultXXXX
methods, but will only return once, like
All setXXXResponse
methods return current MockServer
instance to support method chaining.
MockServer
returns a 404
error for un-set path.
(easywebmockdemo)[https://github.com/Wuvist/easywebmockdemo] is a demo project using Spring Boot & kotlin.
It contains a simple UserController
than make use of UserService
to call a backend API and render page with return User
object.
When using mockito, testing code will be like:
@Test
fun testUserController() {
val user = User("test user", "test@abc.com", 18)
`when`(userService.getUser(anyString())).thenReturn(Mono.just(user));
val html = controller.user("userId").block()!!
assertEquals(html, "<html><body><h1>test user: 18</body>")
}
It works, but we will need to write to additional test for UserService
, otherwise it won't be covered:
When using easywebmock
, testing code, will be like:
@Test
fun testController() {
val user = User("test user", "test@abc.com", 18)
MockServerManager.setDefaultResponseJson("/user.json", user)
val html = controller.user("userId").block()!!
assertEquals(html, "<html><body><h1>test user: 18</body>")
}
It's almost identical to mockito version, except than actual UserService
will be called in spring context, thus provide more coverage.