Okhttp Json Mock

Additional

Language
Java
Version
N/A
Created
Feb 8, 2017
Updated
Apr 28, 2018
Owner
Mohammad Mirrajabi (mirrajabi)
Contributor
Mohammad Mirrajabi (mirrajabi)
1
Activity
Badge
Generate
Download
Source code
APK file

Advertisement

okhttp-json-mock

This simple library helps you mock your data for using with okhttp+retrofit in json format in just a few moves. it forwards the requests to local json files and returns the data stored in them.

Version 2.0 Notes:

Since version 2.0 the dependency to android platform is removed so it will be useful for all your jvm-based projects, not just android. You can still use version 1.1.1 if you don't care.

Usage

First add jitpack to your projects build.gradle file

allprojects {
    repositories {
     ...
     maven { url "https://jitpack.io" }
    }
}

Then add the dependency in modules build.gradle file

dependencies {
    compile 'com.github.mirrajabi:okhttp-json-mock:2.0'
 }

Since version 2.0:

  1. Construct your custom InputStreamProvider:
InputStreamProvider inputStreamProvider = new InputStreamProvider() {
    @Override
    public InputStream provide(String path) {
        try {
            return getAssets().open(path);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
};
  1. Use the InputStreamProvider to construct the OkHttpMockInterceptor and client:
OkHttpClient client = new OkHttpClient.Builder()
    .addInterceptor(new OkHttpMockInterceptor(getAndroidProvider(), 5))
    .build();

For version 1.+

1. Add OkhttpMockInterceptor to your OkhttpClient instance and attach it to your retrofit instance

OkHttpClient mOkHttpClient = new OkHttpClient.Builder()
    .addInterceptor(new OkHttpMockInterceptor(this, 5))
    .build();
    
mRetrofit = new Retrofit.Builder()
    .addConverterFactory(GsonConverterFactory.create())
    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
    .baseUrl("http://example.com")
    .client(mOkHttpClient)
    .build();

2. Prepare your api service interfaces for retrofit

//usage example /users/page=phoneNumbers.json
@GET(API_VERSION + "/users")
Observable<ArrayList<UserModel>> getUsers(@Query("page") int page);

//usage example /users/page=1&secondParameter=phoneNumbers.json
@GET(API_VERSION + "/users")
Observable<ArrayList<UserModel>> getUsers(@Query("page") int page,
                                          @Query("name") String name);

//usage example /users/1.json
@GET(API_VERSION + "/users/{userId}")
Observable<UserModel> getUser(@Path("userId") int userId);

//usage example /users/1/phoneNumbers.json
@GET(API_VERSION + "/users/{userId}/phoneNumbers")
Observable<ArrayList<String>> getUserNumbers(@Path("userId") int userId);

3. Put your json models in assets folder like the examples

\---api
    \---v1
        \---users
            |   1.json
            |   2.json
            |   3.json
            |   page=1.json
            |
            +---1
            |       phoneNumbers.json
            |
            +---2
            |       phoneNumbers.json
            |
            \---3
                    phoneNumbers.json

Notes

JSON Response models

The base response model is MockedResponse.java so the json response should look like the ones below :

1. Response is a single object(not an array)
{
  "status": 200,
  "response": {
    "id": 0,
    "name": "John",
    "lastName": "Doe",
    "age": 20,
    "phoneNumbers": [
      "0123456789",
      "3215467891",
      "1645189442"
    ]
  }
}

where response object is the result that the interceptor will return

2. Response is a list of objects(e.g. an arraylist)

in this case the items object in response is the array that will be returned.

{
  "status": 200,
  "response": {
    "items": [
      {
        "id": 0,
        "name": "John",
        "lastName": "Doe",
        "age": 20,
        "phoneNumbers": [
          "0123456789",
          "3215467891",
          "1645189442"
        ]
      },
      {
        "id": 1,
        "name": "Jane",
        "lastName": "Doe",
        "age": 22,
        "phoneNumbers": [
          "1532131512"
        ]
      }
    ]
  }
}

Retrofit's annotations

Currently @Query and @Path can be achieved simply with correct folder and file namings (like website routes) for example if you have a request like

@GET("api/v1/posts/{userId}")
Observable<ArrayList<Post>> getUserPosts(@Path("userId"),
                                         @Query("page") int page,
                                         @Query("categoryId") int categoryId);

you can have json models in api/v1/posts/{userId} where {userId} could be an integer like api/v1/posts/3 and in that folder the json files should have names like page=1&categoryId=5.json so multiple queries are achievable by seperating them using Ampersand(&) character

You can take a look at Sample app for a working example

Contributions

Any contributions are welcome. just fork it and submit your changes to your fork and then create a pull request

Changelog

2.0 - The library no longer depends on android classes

1.1.1 - Fixes file name lowercase issue

1.1 - Adds delay customization option.