I am using Retrofit2 for API calls, now I want to write Junit test cases for all the success and error responses to check whether my application behaves correctly or not. I want to know how can I mock the responses without using interceptors and any third party library. I am using mockito for writing Junit test cases and the API level supported should be 24 in android.
public final class ProductService {
public static final int TIME_OUT = 30;
private static ProductService mProductService;
private Retrofit mRetrofit;
private ProductsApi mProductsApi;
private ProductService() {
final HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
final OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(logging)
.build();
mRetrofit = new Retrofit.Builder()
.baseUrl(BuildConfig.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient.newBuilder().connectTimeout(TIME_OUT, TimeUnit.SECONDS)
.readTimeout(TIME_OUT, TimeUnit.SECONDS)
.writeTimeout(TIME_OUT, TimeUnit.SECONDS).build()).build();
mProductsApi = mRetrofit.create(ProductsApi.class);
}
public ProductsApi getProductsApi() {
return mProductsApi;
}
public static ProductService getInstance() {
if (mProductService == null) {
mProductService = new ProductService();
}
return mProductService;
}
}
public interface ProductsApi {
@POST("api/product_search")
Call<ProductsResponseModel> loadProducts(@HeaderMap HashMap<String, String> header,
@Body ProductRequestModel productRequestModel);
}
public void loadProducts(final ProductListener productListener,
HashMap<String, String> headersMap, ProductRequestModel productRequestModel) {
final Call<ProductsResponseModel> requestCall = mProductsApi.loadProducts(headersMap,
productRequestModel);
requestCall.enqueue(new Callback<ProductsResponseModel>() {
@Override
public void onResponse(Call<ProductsResponseModel> call,
Response<ProductsResponseModel> response) {
List<ProductModel> productList = null;
if (response.isSuccessful() && response.body().getData().size() > 0) {
productList = response.body().getData();
productListener.success(productList);
}
else {
productListener.onFailure();
}
}
@Override
public void onFailure(Call<ProductsResponseModel> call, Throwable t) {
productListener.onFailure();
}
});
}
Test: I am trying something like this but it's not working
@Test
public void testLoadProducts() {
ProductsApi productsApi = Mockito.mock(ProductsApi.class, RETURNS_DEEP_STUBS);
Mockito.when(productsApi.loadProducts().execute()).thenReturn(Response.success(ProductsResponseModel.class));
mProductsController.loadProducts(new ProductListener() {
@Override
public void onProductLoadSuccess(List<ProductModel> productList) {
Assert.assertFalse(productList != null);
}
@Override
public void onProductLoadFailed() {
Assert.assertFalse(false);
}
}, mHeadersMap, productRequestModel);
}
In Test, I want to validate the application's behavior in case of success and for all error codes my mocking the response. In the above test snippet, I am also getting error as Can not access Retrofit2.Call