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:
o
https://gist.github.com/chemouna/00b10369eb1d5b00401b
o più.
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
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
Sì, in generale, questo problema si verifica molto spesso. A volte devi tenere alcune lezioni in proguard. – F1sher