2015-12-08 13 views
6

Ultimamente ho bisogno di testare RecyclerView e sto avendo un sacco di problemi a fare qualsiasi cosa con esso.Testare recyclerView con Espresso, come eseguire click o fare asserzioni

Prima di tutto sono venuto a sapere che Espresso sta già "supportando" RecyclerViews fornendoci RecyclerViewActions in espresso-contrib. Così ho deciso di usarlo e le mie dipendenze sembra così:

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" 
} 

Ma come solo si tenta di eseguire il mio test dopo aver cambiato espresso-core all'espresso-contrib. Posso vedere questo errore:

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

Ho provato a google fuori. Ho visto molti argomenti in cui le persone davano risposte come this one. Quindi ho escluso appcompat, supportv4 e recyclerview-v7. Mi piace:

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' 
    } 

E i test iniziano ma ... Non riesco a utilizzare nessuna opzione di RecyclerView. Perché non ci sono metodi dopo aver escluso recyclerview-v7 cosa è raccomandato quasi ovunque io abbia visto sul web. Quando provo ad usare - RecyclerViewActions.actionOnItemAtPosition - il metodo che è fondamentale per me ottenere questo errore:

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) 

Così Preferisco avere questo recyclerview-V7, invece di escluderlo. Modifico il mio espresso-contrib importazione:

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' 
    } 

periodo di prova di nuovo, ma ... ottengo l'errore da qualche parte durante le prove:

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

Così sto usando librerie più recenti nel mio 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' 

E NavigationView utilizza il nuovo RecyclerView 23.1.1. Cerco di trovare ciò che è sbagliato in modo da visualizzare le dipendenze di caffè espresso-contrib utilizzando app ./gradlew: dipendenze in console e posso vedere:

+--- 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 

Va bene così espresso-contrib-2.2.1, che è più recente sta usando com.android.support:recyclerview-v7:23.0.1 - non è la versione più recente di recyclerView e sta causando un errore. Decido di aggiornarlo all'interno espresso-contrib aggiungendo:

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

ho usare app: ancora una volta le dipendenze e posso vedere il cambiamento:

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

comincio di nuovo test. E non ottengo l'errore con NavigationView più - credo che sia risolto, ma ... viene visualizzato un altro errore:

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

E ora sono un po 'a corto di idee. Quando si osservano le dipendenze di espresso-contrib, a mio parere non sta usando nulla che potrebbe utilizzare la barra degli strumenti. Toolbar fa parte di appcompat-v7, quindi cerco di aggiungerlo nello stesso modo in cui ho aggiornato recyclerView alla versione più recente. Quindi aggiungo:

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

Ma non mi aiuta. E io sono bloccato.

Hai affrontato questi problemi? Avete qualche soluzione su come fare clic su recyclerView? Come verificare se l'elemento in recyclerView ha un testo o qualcosa del genere? Tutte le soluzioni che ho trovato sul web utilizzano il metodo: findViewHolderForPosition che non posso utilizzare dopo aver escluso il modulo recyclerview-v7. Come:

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 più.

risposta

2

problema con Toolbar è causato dal fatto, alcune delle librerie che uso nel mio file app.gradle non ha più recente RecyclerView quindi avevo bisogno di aggiungere anche:

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

Problema con java.lang.NoSuchMethodError è dalla mia parte. La configurazione di ProGuard stava eliminando alcuni metodi.

+0

Ciao F1sher, felice che tu abbia risolto il tuo problema. Ho un problema simile con 'NoSuchMethodError' in' RecyclerViewActions'. Potresti essere più specifico e condividere le regole Proguard aggiunte o cancellate per farlo funzionare? Forse puoi aiutare molte persone in questo modo – mdelolmo

+4

Finalmente l'ho scoperto da solo. Aggiunta della regola '-keep class android.support.v7.widget.RecyclerView {*; } 'fa il trucco. Complimenti a F1sher per il suggerimento, però. – mdelolmo

+0

Sì, in generale, questo problema si verifica molto spesso. A volte devi tenere alcune lezioni in proguard. – F1sher

Problemi correlati