Intereting Posts
Таблица действий Android Android, как узнать общее количество интернет-данных в день через Wi-Fi и мобильный Как сделать FileProvider доступным для других приложений? Как изменить высоту экрана вкладки панели действий Выравнивание вкладок PagerTabStrip влево Android Share Intent для растрового изображения – возможно ли сохранить его ранее? Как сделать json api В чем разница между «min sdk, target sdk и compile with»? В андроиде Sugar ORM Migration: создание новых таблиц / восстановление существующих таблиц Как указать Wi-Fi-сеть с помощью NetworkRequest.Builder (). SetNetworkSpecifier (string) Как я могу создать макет большего размера, чем экран телефона? Что такое исключение NullPointerException и как его исправить? Google map v2 Пользовательская информация с двумя кнопками мыши или ImageView Как выполнить действие после щелчка по нажатой кнопке DialogFragment Откройте страницу facebook из приложения Android (в версии для facebook> v11)

Android RecyclerView Adapter Количество элементов возвращается 0 при модульном тестировании

Я пытаюсь проверить RecyclerView с AndroidJunit4, это мой тестовый код:

@Rule public ActivityTestRule<ProductListActivity> rule = new ActivityTestRule<>(ProductListActivity.class); ............................ .......................... @Test public void ensureDataIsLoadingOnSuccess() throws Exception { ProductListActivity activity = rule.getActivity(); ........................... ............ activity.runOnUiThread(new Runnable() { public void run() { activity.displayProducts(asList(product1, product2), 0); } }); assertEquals(2, mAdapter.getItemCount()); assertThat(((ProductAdapter) mAdapter).getItemAtPosition(0),sameInstance(product1)); assertThat(((ProductAdapter) mAdapter).getItemAtPosition(1),sameInstance(product2)); } 

Вот мой код для displayProducts () в действии:

 @Override public void displayProducts(List<Product> products, Integer pageNo) { progressBar.setVisibility(View.GONE); if (pageNo == 0 && products.size() == 0) { noProductTextView.setVisibility(View.VISIBLE); } else { mProductAdapter.addProduct(products); noProductTextView.setVisibility(View.GONE); productListView.setVisibility(View.VISIBLE); } } 

Это дает ошибку, например:

 junit.framework.AssertionFailedError: expected:<2> but was:<0> at junit.framework.Assert.fail(Assert.java:50) at junit.framework.Assert.failNotEquals(Assert.java:287) at junit.framework.Assert.assertEquals(Assert.java:67) at junit.framework.Assert.assertEquals(Assert.java:199) at junit.framework.Assert.assertEquals(Assert.java:205) at com.kaushik.myredmart.ui.ProductListActivityTest.ensureDataIsLoadingOnSuccess(ProductListActivityTest.java:94) 

Пожалуйста, помогите, в чем проблема в моем коде?

Solutions Collecting From Web of "Android RecyclerView Adapter Количество элементов возвращается 0 при модульном тестировании"

Причина в том, что ваш тест эспрессо не дождался вашей задачи загрузки, которая требует много времени. Вам нужно использовать espresso-idling-resource чтобы сказать, чтобы он дождался завершения этой задачи.

Затем вам понадобится класс для реализации IdlingResource и объявите его своей деятельностью.

Когда ваш тест Espresso будет запущен, он будет знать и ждать вашей долговременной задачи, чтобы завершить и проверить результат.

Во-первых, добавьте его зависимость.

  compile "com.android.support.test.espresso:espresso-idling-resource:2.2.2" 

Во-вторых, вам нужны два файла Java в папке src / main / java / your-package.
SimpleCountingIdlingResource.java

 public final class SimpleCountingIdlingResource implements IdlingResource { private final String mResourceName; private final AtomicInteger counter = new AtomicInteger(0); // written from main thread, read from any thread. private volatile ResourceCallback resourceCallback; /** * Creates a SimpleCountingIdlingResource * * @param resourceName the resource name this resource should report to Espresso. */ public SimpleCountingIdlingResource(String resourceName) { mResourceName = checkNotNull(resourceName); } @Override public String getName() { return mResourceName; } @Override public boolean isIdleNow() { return counter.get() == 0; } @Override public void registerIdleTransitionCallback(ResourceCallback resourceCallback) { this.resourceCallback = resourceCallback; } /** * Increments the count of in-flight transactions to the resource being monitored. */ public void increment() { counter.getAndIncrement(); } /** * Decrements the count of in-flight transactions to the resource being monitored. * * If this operation results in the counter falling below 0 - an exception is raised. * * @throws IllegalStateException if the counter is below 0. */ public void decrement() { int counterVal = counter.decrementAndGet(); if (counterVal == 0) { // we've gone from non-zero to zero. That means we're idle now! Tell espresso. if (null != resourceCallback) { resourceCallback.onTransitionToIdle(); } } if (counterVal < 0) { throw new IllegalArgumentException("Counter has been corrupted!"); } } } 

EspressoIdlingResource.java

 public class EspressoIdlingResource { private static final String RESOURCE = "GLOBAL"; private static SimpleCountingIdlingResource mCountingIdlingResource = new SimpleCountingIdlingResource(RESOURCE); public static void increment() { mCountingIdlingResource.increment(); } public static void decrement() { mCountingIdlingResource.decrement(); } public static IdlingResource getIdlingResource() { return mCountingIdlingResource; } } 

ОК. Перейдем к Управлению, где у вас есть трудоемкая задача. Во-первых, поставьте этот метод на дно.

 @VisibleForTesting public IdlingResource getCountingIdlingResource() { return EspressoIdlingResource.getIdlingResource(); } 

В вашей трудоемкой задаче. Вы должны сказать своему эспрессо, чтобы он подождал так.

 EspressoIdlingResource.increment(); yourTask.run(new Callback() { void onFinish(){ EspressoIdlingResource.decrement(); } }) 

Конечным шагом является определение этих методов в вашем тестовом классе пользовательского интерфейса.

 @Before public void registerIdlingResource() { Espresso.registerIdlingResources(mOnBoardActivityTestRule.getActivity().getCountingIdlingResource()); } /** * Unregisters your idling resource so it can be garbage collected and does not leak any memory */ @After public void unregisterIdlingResource() { Espresso.unregisterIdlingResources(mOnBoardActivityTestRule.getActivity().getCountingIdlingResource()); } 

Да. Наконец мы сделали.

Существует одна проблема, которую я вижу здесь, и вы запрашиваете размер списка до того, как поток Main / UI сможет его обновить. Таким образом, вам придется ждать в текущем потоке, пока активность не завершит обновление списка в основном потоке.

Ты можешь сделать,

 Thread.sleep(500); 

В классе Test для ожидания, чтобы проверить поведение настройки списка в Activity, и вы убедитесь, что это утверждение действительно.

Поскольку основной поток работает бесконечно до тех пор, пока приложение не будет запущено, вам нужно будет реализовать интерфейс обратного вызова, предоставляемый Activity, чтобы быть проинформированным о том, когда заполняется список.