Skip to content

A simple OKHttp client mock, using a programmable request interceptor

License

Notifications You must be signed in to change notification settings

gmazzo/okhttp-client-mock

Folders and files

NameName
Last commit message
Last commit date

Latest commit

5a7e318 · Mar 25, 2025
Mar 25, 2025
Mar 25, 2025
Mar 14, 2025
Mar 14, 2025
Dec 17, 2018
Aug 7, 2017
Mar 14, 2025
Mar 12, 2025
Mar 14, 2025
Feb 26, 2025
Jul 12, 2024
Mar 14, 2025

Repository files navigation

okhttp-client-mock

A simple OKHttp client mock, using a programmable request interceptor

GitHub Maven Central Build Status codecov Users

Import

On your build.gradle add:

dependencies {
    testImplementation 'com.github.gmazzo.okhttp.mock:mock-client:<version>'
}

Usage

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 classpath
  • AndroidResources.asset to load content from an Android's asset
  • AndroidResources.rawRes to load content from an Android's raw resource
  • RoboResources.asset and RoboResources.rawRes if you are running Roboelectric tests

About

A simple OKHttp client mock, using a programmable request interceptor

Resources

License

Stars

Watchers

Forks

Packages

No packages published