0

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

user_8275
  • 233
  • 4
  • 15

0 Answers0