Skip to content

Instantly share code, notes, and snippets.

@polbins
Last active March 7, 2019 04:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save polbins/75327605f335ea74b2abfd442e60c706 to your computer and use it in GitHub Desktop.
Save polbins/75327605f335ea74b2abfd442e60c706 to your computer and use it in GitHub Desktop.
Android Unit Test Utility Classes

Android/Java Unit Test Utility Classes

RetrofitTestUtil

Mocks Retrofit Calls (success/failure)

e.g.

    RetrofitTestUtil.createCall(createDummyResponse());
    RetrofitTestUtil.createCall(500, createDummyErrorResponse());

JsonTestUtil

Converts JSON files into JSON objects using Jackson

e.g.

    ApiModel model = JsonTestUtil.getJsonFromFile("model.json", ApiModel.class);

Samples

    // Mock a successful API call
    ApiModel model = JsonTestUtil.getJsonFromFile("model.json", ApiModel.class);
    Mockito.when(apiService.get())
            .thenReturn(RetrofitTestUtil.createCall(actors));
public class JsonTestUtil {
private static ObjectMapper mObjectMapper;
private static ObjectMapper getObjectMapper() {
if (mObjectMapper == null) {
mObjectMapper = new ObjectMapper();
}
return mObjectMapper;
}
@JsonIgnore
public static <M> M fromString(String jsonString, Class<M> modelClass) throws IOException {
return getObjectMapper().readValue(jsonString, modelClass);
}
@JsonIgnore
public static String fromJson(Object object) throws JsonProcessingException {
return getObjectMapper().writeValueAsString(object);
}
public static <M> M getJsonFromFile(String jsonFileName, Class<M> jsonClass) {
InputStream inputStream = getInputStreamFromFile(jsonFileName);
String jsonString = convertStreamToString(inputStream);
M jsonObject = null;
try {
jsonObject = fromString(jsonString, jsonClass);
} catch (IOException e) {
e.printStackTrace();
}
return jsonObject;
}
private static InputStream getInputStreamFromFile(String fileName) {
ClassLoader classLoader = ClassLoader.getSystemClassLoader();
return classLoader.getResourceAsStream(fileName);
}
private static String convertStreamToString(java.io.InputStream is) {
java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
return s.hasNext() ? s.next() : "";
}
}
public class RetrofitTestUtil {
public static <T> Call<T> createCall(T response) {
return new MockCall<>(response);
}
public static <T> Call<T> createCall(int responseCode, T response) {
return new MockCall<>(responseCode, response);
}
private static class MockCall<T> implements Call<T> {
final T mResponse;
final int mCode;
public MockCall(int code, T response) {
mResponse = response;
mCode = code;
}
public MockCall(T response) {
this(200, response);
}
@Override
public Response<T> execute() throws IOException {
return buildResponse();
}
@Override
public boolean isExecuted() {
return false;
}
@Override
public boolean isCanceled() {
return false;
}
@Override
public Request request() {
return null;
}
@NonNull
private Response<T> buildResponse() {
if (mCode > 199 && mCode < 300) {
return Response.success(mResponse);
} else {
return Response.error(mCode, new DummyResponseBody());
}
}
@Override
public void enqueue(Callback<T> callback) {
if (mCode > 0) {
callback.onResponse(null, buildResponse());
} else {
callback.onFailure(null, null);
}
}
@Override
public void cancel() {
}
@SuppressWarnings("CloneDoesntCallSuperClone")
@Override
public Call<T> clone() {
return new MockCall<>(mResponse);
}
}
private static class DummyResponseBody extends ResponseBody {
@Override
public MediaType contentType() {
return null;
}
@Override
public long contentLength() {
return 0;
}
@Override
public BufferedSource source() {
return null;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment