Я использую 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