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.
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:1.1.1'
}
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();
Constructors
OkHttpMockInterceptor(Context context, int failurePercentage)
OkHttpMockInterceptor(Context context,
int failurePercentage,
int minDelayMilliseconds,
int maxDelayMilliseconds)
OkHttpMockInterceptor(Context context,
int failurePercentage,
String basePath,
int minDelayMilliseconds,
int maxDelayMilliseconds)
//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
The base response model is MockedResponse.java so the json response should look like the ones below :
{
"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
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"
]
}
]
}
}
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
Any contributions are welcome. just fork it and submit your changes to your fork and then create a pull request
1.1.1 - Fixes file name lowercase issue
1.1 - Adds delay customization option.