Prueba recyclerView con Espresso, cómo realizar clics o hacer afirmaciones

Últimamente tengo que probar RecyclerView y tengo muchos problemas para hacer algo con él.

En primer lugar, llegué a saber que Espresso ya está "apoyando" RecyclerViews proporcionándonos RecyclerViewActions ubicadas en espresso-contrib . Así que he decidido usarlo y mis dependencias se ve así:

dependencies { androidTestCompile 'junit:junit:4.12' androidTestCompile 'com.squareup.spoon:spoon-client:1.2.1' androidTestCompile 'com.jraska:falcon-spoon-compat:0.3.1' androidTestCompile 'com.android.support:support-annotations:23.1.1' androidTestCompile 'com.android.support.test:runner:0.4.1' androidTestCompile 'com.android.support.test:rules:0.4.1' androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2.1' androidTestCompile "org.mockito:mockito-core:1.10.19" androidTestCompile "com.google.dexmaker:dexmaker:1.2" androidTestCompile "com.google.dexmaker:dexmaker-mockito:1.2" } 

Pero como sólo intento ejecutar mi prueba después de cambiar espresso-core a espresso-contrib. Puedo ver este error:

 Test running failed: Instrumentation run failed due to 'java.lang.IncompatibleClassChangeError' 

Traté de google fuera. Vi muchos temas en los que la gente estaba dando respuestas como ésta . Así que excluí appcompat, supportv4 y recyclerview-v7. Como eso:

  androidTestCompile ('com.android.support.test.espresso:espresso-contrib:2.2.1') { exclude group: 'com.android.support', module: 'appcompat' exclude group: 'com.android.support', module: 'support-v4' exclude module: 'recyclerview-v7' } 

Y las pruebas comienzan pero … No puedo usar ninguna RecyclerViewActions. Porque no hay métodos después de excluir recyclerview-v7 lo que se recomienda casi en todas partes que vi en la web. Cuando trato de usar – RecyclerViewActions.actionOnItemAtPosition – el método que es el núcleo para mí me sale este error:

 java.lang.NoSuchMethodError: No virtual method findViewHolderForPosition(I)Landroid/support/v7/widget/RecyclerView$ViewHolder; in class Landroid/support/v7/widget/RecyclerView; or its super classes (declaration of 'android.support.v7.widget.RecyclerView' appears in /data/app/com.myapp.debug1-1/base.apk) at android.support.test.espresso.contrib.RecyclerViewActions$ActionOnItemAtPositionViewAction.perform(RecyclerViewActions.java:288) at android.support.test.espresso.ViewInteraction$1.run(ViewInteraction.java:144) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

Así que prefiero tener este recyclerview-v7 en lugar de excluirlo. Modifico mi importación espresso-contrib a:

  androidTestCompile ('com.android.support.test.espresso:espresso-contrib:2.2.1') { exclude group: 'com.android.support', module: 'appcompat' exclude group: 'com.android.support', module: 'support-v4' } 

La prueba funciona otra vez pero … Consigo el error en alguna parte durante pruebas:

 android.view.InflateException: Binary XML file line #36: Error inflating class android.support.design.widget.NavigationView 

Así que estoy usando las librerías más recientes en mi gradle:

  compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:support-v13:23.1.1' compile 'com.android.support:cardview-v7:23.1.1' compile 'com.android.support:design:23.1.1' 

Y NavigationView está utilizando el nuevo RecyclerView 23.1.1. Trato de encontrar lo que está mal, así que mostrar dependencias de espresso-contrib mediante la aplicación ./gradlew: dependencias en la consola y puedo ver:

  +--- com.android.support.test.espresso:espresso-contrib:2.2.1 | +--- com.android.support.test.espresso:espresso-core:2.2.1 | | +--- com.squareup:javawriter:2.1.1 | | +--- com.android.support.test:runner:0.4.1 (*) | | +--- com.android.support.test:rules:0.4.1 (*) | | +--- javax.inject:javax.inject:1 | | +--- org.hamcrest:hamcrest-library:1.3 | | | \--- org.hamcrest:hamcrest-core:1.3 | | +--- org.hamcrest:hamcrest-integration:1.3 | | | \--- org.hamcrest:hamcrest-library:1.3 (*) | | +--- com.google.code.findbugs:jsr305:2.0.1 | | +--- javax.annotation:javax.annotation-api:1.2 | | \--- com.android.support.test.espresso:espresso-idling-resource:2.2.1 | +--- com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:2.0 | | \--- org.hamcrest:hamcrest-core:1.3 | \--- com.android.support:recyclerview-v7:23.0.1 | \--- com.android.support:support-annotations:23.0.1 -> 23.1.1 

Muy bien, espresso-contrib-2.2.1, que es el más reciente, está usando com.android.support:recyclerview-v7:23.0.1 – no la versión más reciente de recyclerView y está causando un error. Decido actualizarlo dentro de espresso-contrib añadiendo:

  androidTestCompile 'com.android.support:recyclerview-v7:23.1.1' 

Uso app: dependencies de nuevo y puedo ver el cambio:

 \--- com.android.support:recyclerview-v7:23.0.1 -> 23.1.1 (*) 

Comienzo las pruebas de nuevo. Y no consigo el error con NavigationView más – pienso que se resuelve pero … otro error aparece:

 android.view.InflateException: Binary XML file line #21: Error inflating class android.support.v7.widget.Toolbar 

Y ahora estoy un poco fuera de las ideas. Al mirar las dependencias de espresso-contrib no está usando nada que podría utilizar la barra de herramientas en mi opinión. La barra de herramientas es parte de appcompat-v7 así que intento agregarla de la misma manera que he actualizado recyclerView a la versión más reciente. Así que agrego:

 androidTestCompile 'com.android.support:appcompat-v7:23.1.1' 

Pero no me ayuda. Y estoy atascado.

¿Se enfrentaron a esos problemas? ¿Tiene alguna solución para hacer clic en recyclerView? ¿Cómo comprobar si el artículo en recyclerView tiene texto o algo así? Todas las soluciones que he encontrado en la web están usando el método: findViewHolderForPosition que no puedo usar después de excluir el módulo recyclerview-v7. Me gusta :

Https://github.com/dannyroa/espresso-samples/tree/master/RecyclerView/app/src/androidTest/java/com/dannyroa/espresso_samples/recyclerview

o

Https://gist.github.com/chemouna/00b10369eb1d5b00401b

o más.

El problema con la barra de herramientas se debe al hecho de que algunas de las librerías que utilizo en mi archivo app.gradle no tienen el RecyclerView más reciente, así que también debía agregar:

 compile 'com.android.support:appcompat-v7:23.1.1' 

Problema con java.lang.NoSuchMethodError está a mi lado. ProGuard config eliminaba algunos métodos.

  • El adaptador de RecyclerView notifyDataSetChanged no funciona
  • Cómo usar el mismo Adaptador RecyclerView para diferentes diseños
  • Getter no está asociado a ningún campo - Realm
  • Error al inflar la clase y android.support.v7.widget.CardView
  • Cómo crear una interfaz de usuario como la aplicación Inbox de Google en Android
  • Estilo de RecyclerView a nivel de tema
  • Implementación diferente para un botón de acción flotante en cada fragmento de una actividad
  • Android Cómo reciclar el mapa de bits correctamente cuando se utiliza RecyclerView?
  • ¿Cómo se puede agregar una línea de divisor en un Android RecyclerView?
  • Haga clic en un elemento de la lista RecyclerView
  • Configurar RecyclerView para trabajar como chat
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.