Last active
May 1, 2021 17:52
-
-
Save riggaroo/a33e1108cf6c2141e2f0 to your computer and use it in GitHub Desktop.
Mocking API Responses using a Retrofit Client in Android
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class RestServiceMockUtils { | |
public static String convertStreamToString(InputStream is) throws Exception { | |
BufferedReader reader = new BufferedReader(new InputStreamReader(is)); | |
StringBuilder sb = new StringBuilder(); | |
String line = null; | |
while ((line = reader.readLine()) != null) { | |
sb.append(line).append("\n"); | |
} | |
reader.close(); | |
return sb.toString(); | |
} | |
public static String getStringFromFile(Context context, String filePath) throws Exception { | |
final InputStream stream = context.getResources().getAssets().open(filePath); | |
String ret = convertStreamToString(stream); | |
//Make sure you close all streams. | |
stream.close(); | |
return ret; | |
} | |
public static RetrofitMockClient getClient(Context context, final int httpStatusCode, String reason, String responseFileName) throws Exception { | |
return new RetrofitMockClient(httpStatusCode, reason, getStringFromFile(context, responseFileName)); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class QuoteOfTheDayServiceTests extends InstrumentationTestCase { | |
public static final TAG = "QODServiceTest"; | |
public static final String BASE_API_URL = "http://api.theysaidso.com/"; | |
@SmallTest | |
public void testAuthoriseFailsForIncorrectSessionId() throws Exception { | |
String jsonResponseFileName = "quote_401_unauthorised.json"; | |
int expectedHttpResponse = 401; | |
String reason = "Unauthorised"; | |
//Create RetrofitMockClient with the expected JSON response and code. | |
RetrofitMockClient retrofitMockClient = RestServiceMockUtils.getClient(getInstrumentation().getContext(), expectedHttpResponse, reason, jsonResponseFileName); | |
RestAdapter restAdapter = new RestAdapter.Builder() | |
.setEndpoint(BASE_API_URL) | |
.setClient(retrofitMockClient) | |
.setConverter(new JacksonConverter()) | |
.setErrorHandler(new RetrofitErrorHandler()) | |
.build(); | |
RestService restServiceClient = restAdapter.create(RestService.class); | |
//Run test code - you can test anything you want to here, test the correct response, the way the UI displays for certain mock JSON. | |
String incorrectApiKey = "incorrectApiKey"; | |
try { | |
String quote = restServiceClient.getQuoteOfTheDay(incorrectApiKey); | |
Assert.fail("Should have thrown unauthorised exception"); | |
} catch (UnauthorizedException unauthorised) { | |
Log.d(TAG, "Successfully caught unauthorised exception when incorrect API key was passed"); | |
} | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class RetrofitMockClient implements Client { | |
private String jsonResponse; | |
private int statusCode = 200; | |
private String reason; | |
private static final String MIME_TYPE = "application/json"; | |
public RetrofitMockClient(int statusCode, String reason, String jsonResponse) { | |
this.statusCode = statusCode; | |
this.reason = reason; | |
this.jsonResponse = jsonResponse; | |
} | |
@Override | |
public Response execute(Request request) throws IOException { | |
return createDummyJsonResponse(request.getUrl(), statusCode, reason, jsonResponse); | |
} | |
private Response createDummyJsonResponse(String url, int responseCode, String reason, String json) { | |
return new Response(url, responseCode, reason, Collections.EMPTY_LIST, | |
new TypedByteArray(MIME_TYPE, json.getBytes())); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment