Как смоделировать ответ API на успех и код ошибки - PullRequest
0 голосов
/ 18 апреля 2020

Я использую Retrofit2 для вызовов API, теперь я хочу написать контрольные примеры Junit для всех ответов об ошибках и успешности, чтобы проверить, правильно ли работает мое приложение или нет. Я хочу знать, как я могу издеваться над ответами без использования перехватчиков и какой-либо сторонней библиотеки. Я использую mockito для написания тестовых примеров Junit, и поддерживаемый уровень API должен быть 24 в 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
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);


    }

В тесте я хочу проверить поведение приложения в случае успеха, и для всех кодов ошибок я высмеиваю ответ. В приведенном выше фрагменте теста я также получаю ошибку как Can not access Retrofit2.Call

...