Skip to content

Instantly share code, notes, and snippets.

@nwellis
Created December 9, 2020 17:26
Show Gist options
  • Save nwellis/e70737bef504c29ac536aa181fedcc65 to your computer and use it in GitHub Desktop.
Save nwellis/e70737bef504c29ac536aa181fedcc65 to your computer and use it in GitHub Desktop.
Retrofit network call behavior mocked with MockK
fun newMockHttpException(
statusCode: Int = 400,
message: String = "Default mock error",
response: Response<Any>? = mockk<Response<Any>>(relaxed = true)
.applyMockDefaults<Any, Any>(statusCode = statusCode)
) = mockk<HttpException>().applyMockDefaults(statusCode, message, response)
fun HttpException.applyMockDefaults(
statusCode: Int = 400,
message: String = "Default mock error",
response: Response<Any>? = mockk<Response<Any>>(relaxed = true)
.applyMockDefaults<Any, Any>(statusCode = statusCode)
) = apply {
every { code() } returns statusCode
every { message() } returns message
every { response() } returns response
}
fun <Body, Error> Call<Body>.applyMockDefaults(
statusCode: Int = 200,
responseBody: Body? = null,
errorBody: Error? = null,
error: Throwable? = null
) = apply {
var hasBeenExecuted = false
if (error != null) {
every { execute() } throws error
} else {
every {
execute()
} answers {
hasBeenExecuted = true
mockk<Response<Body>>().applyMockDefaults<Body, Error>()
} andThenThrows IllegalStateException("Call has already been executed")
}
every { isExecuted } returns hasBeenExecuted
}
fun <Body, Error> Response<Body>.applyMockDefaults(
statusCode: Int = 200,
responseBody: Body? = null,
errorBody: Error? = null
) = apply {
every { isSuccessful } returns (statusCode in 200 until 300)
every { code() } returns statusCode
every { body() } returns responseBody.takeIf { isSuccessful }
val errorJson = Gson().toJson(errorBody) // Will not parse dates correctly, use Koin?
every { errorBody() } returns mockk<ResponseBody> {
every { contentType() } returns "application/json; charset=utf-8".toMediaType()
every { string() } returns errorJson
}.takeIf { !isSuccessful }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment