Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android RecyclerView Adapter El número de artículos está devolviendo 0 en la prueba de unidad

Estoy tratando de probar RecyclerView con AndroidJunit4, es mi código de prueba:

@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)); } 

Aquí está mi código para displayProducts () en Activity:

  • Fragmento superpone mi barra de herramientas de AppCompat
  • ¿Cómo tomar la captura de pantalla de la página de actividad ENTERO mediante programación?
  • @ Font-face no funciona en Webkit para móviles
  • Lo que hace que mi fragmento de mapa de carga lento?
  • Android Google Plus API - PeopleApi.loadConnected devuelve 0 personas
  • Restaurar el estado de TextView después de la rotación de la pantalla?
  •  @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); } } 

    Es dar error como:

     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) 

    Por favor, ¿cuál es el problema en mi código?

  • La vista previa de la cámara está en modo vertical, pero la imagen capturada se gira
  • ShareActionProvider no se puede hacer clic y no se procesa correctamente en el primer procesamiento
  • Cómo ocultar barra de herramientas / barra de herramientas mientras desplaza hacia abajo en Webview
  • ListFragment OnListItemClick no se llama
  • Manejo de preferencias de Android sin cadenas mágicas
  • Escucha los mensajes / notificaciones de Whatsapp entrantes
  • 2 Solutions collect form web for “Android RecyclerView Adapter El número de artículos está devolviendo 0 en la prueba de unidad”

    La razón es que su prueba de Espresso no esperó su tarea de carga que consume mucho tiempo. Necesitas usar un recurso espresso-idling-resource para decirle que espere esta tarea para terminar.

    Entonces necesita una clase para implementar IdlingResource y declararla como su Actividad.

    Cuando su prueba de Espresso se ejecute, sabrá y esperará su tarea de consumir mucho tiempo para completar y probar el resultado.

    En primer lugar, añadir su dependencia.

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

    En segundo lugar, se necesitan dos archivos Java en la carpeta 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; } } 

    De acuerdo. Vamos a Actividad donde tienes una tarea que requiere mucho tiempo. En primer lugar, poner este método en la parte inferior.

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

    Dentro de su tarea de tiempo. Usted debe decirle a su Espresso para esperar así.

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

    El paso final es definir estos métodos en la clase de prueba de UI.

     @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()); } 

    Sí. Finalmente lo hicimos.

    Hay un problema que puedo ver aquí, estás preguntando el tamaño de la lista antes de que el hilo principal / UI pueda actualizarlo. Por lo tanto, tendrá que esperar en el hilo actual hasta que la Actividad termine de actualizar la lista en el hilo principal.

    Tu puedes hacer,

     Thread.sleep(500); 

    En la clase de prueba para esperar, para probar el comportamiento de configuración de lista en actividad y verá que la afirmación es válida.

    Dado que, el hilo principal se ejecuta infinitamente hasta que la aplicación se está ejecutando, tendrá que implementar una interfaz de devolución de llamada proporcionada por la actividad para ser informado sobre cuándo se ha completado la lista.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.