A simple OKHttp client mock, using a programmable request interceptor
On your build.gradle
add:
dependencies {
testImplementation 'com.github.gmazzo.okhttp.mock:mock-client:<version>'
}
Create an OkHttp request interceptor and record some rules, for instance:
val interceptor = MockInterceptor().apply {
rule(get or post or put, url eq "https://testserver/api/login") {
respond(HTTP_401_UNAUTHORIZED).header("WWW-Authenticate", "Basic")
}
rule(url eq "https://testserver/api/json") {
respond("{succeed:true}", MEDIATYPE_JSON)
}
rule(url eq "https://testserver/api/json") {
respond(resource("sample.json"), MEDIATYPE_JSON)
}
rule(path matches "/aPath/(\\w+)".toRegex(), times = anyTimes) {
respond { body("Path was " + it.url().encodedPath()) }
}
rule(delete) {
respond(code = HTTP_405_METHOD_NOT_ALLOWED) {
body("{succeed:false}", MEDIATYPE_JSON)
}
}
// throw an exception
rule(get) {
respond { throw IllegalStateException("an IO error") }
}
}
Or in Java:
MockInterceptor interceptor = new MockInterceptor();
interceptor.addRule()
.get().or().post().or().put()
.url("https://testserver/api/login")
.respond(HTTP_401_UNAUTHORIZED)
.header("WWW-Authenticate", "Basic");
interceptor.addRule()
.get("https://testserver/api/json")
.respond("{succeed:true}", MEDIATYPE_JSON);
interceptor.addRule()
.get("https://testserver/api/json")
.respond(resource("sample.json"), MEDIATYPE_JSON);
interceptor.addRule()
.pathMatches(Pattern.compile("/aPath/(\\w+)"))
.anyTimes()
.answer(request -> new Response.Builder()
.code(200)
.body(ResponseBody.create(null, "Path was " + request.url().encodedPath())));
Then add the interceptor to your OkHttpClient client and use it as usual:
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.build();
Check an example Integration Test with mocked HTTP responses
You can use the following helper classes to provide mock responses from resources:
ClasspathResources.resource
to load content from classpathAndroidResources.asset
to load content from an Android's assetAndroidResources.rawRes
to load content from an Android's raw resourceRoboResources.asset
andRoboResources.rawRes
if you are running Roboelectric tests