Тестирование recyclerView с помощью эспрессо, как выполнить щелчок или сделать утверждения

в последнее время мне нужно протестировать RecyclerView, и у меня много проблем, чтобы сделать что-нибудь с ним.

прежде всего я узнал, что эспрессо уже "поддерживает" RecyclerViews, предоставляя нам RecyclerViewActions, расположенные в эспрессо-contrib. Поэтому я решил использовать его, и мои зависимости выглядят так:

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

но как только я пытаюсь запустить свой тест после изменения espresso-core на espresso-contrib. Я вижу это ошибка:

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

я попытался погуглить его. Я видел много тем, где люди давали ответы типа этот. Поэтому я исключил appcompat, supportv4 и recyclerview-v7. Вот так:

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

и тесты начинаются, но... Я не могу использовать RecyclerViewActions. Потому что нет никаких методов после исключения recyclerview-v7, что рекомендуется почти везде, где я видел в интернете. Когда я пытаюсь использовать-RecyclerViewActions.actionOnItemAtPosition-метод который является ядром для меня, я получаю эту ошибку:

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.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)

поэтому я бы предпочел иметь этот recyclerview-v7 вместо его исключения. Я изменяю свой импорт espresso-contrib на:

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

тестовый запуск снова, но... Я получаю ошибку где-то во время тестов:

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

поэтому я использую самые последние libs в моем 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'

и NavigationView использует новейший RecyclerView 23.1.1. Я пытаюсь найти, что не так, поэтому я отображаю зависимости espresso-contrib от с помощью./ gradlew app: зависимости в консоли, и я вижу:

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

хорошо, так эспрессо-contrib-2.2.1, который является новейшим, использует com.андроид.поддержка: recyclerview-v7: 23.0.1 - не самая последняя версия recyclerView, и это вызывает ошибку. Я решил обновить его внутри espresso-contrib, добавив:

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

я снова использую app:зависимости, и я вижу изменения:

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

я снова начинаю тесты. И я больше не получаю ошибку с NavigationView - Я думаю, это решено, но ... .. появляется еще одна ошибка:

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

и теперь у меня немного нет идей. Когда вы смотрите на зависимости espresso-contrib, он не использует ничего, что может использовать панель инструментов, на мой взгляд. Панель инструментов является частью appcompat-v7, поэтому я пытаюсь добавить ее так же, как я обновил recyclerView до последней версии. Поэтому я добавляю:--13-->

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

но мне это не помогает. И я застрял.

вы столкнулись с этими проблемами? У вас есть обходной путь как нажать на recyclerView? Как проверить, имеет ли элемент в recyclerView текст или что-то в этом роде? Все решения, которые я нашел в интернете, используют метод: findViewHolderForPosition, который я не могу использовать после исключения модуля recyclerview-v7. Как :

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

или

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

или больше.

1 ответов


проблема с панелью инструментов вызвана тем, что некоторые из библиотек я использую в своем приложении.файл gradle не имеет последнего RecyclerView, поэтому мне нужно добавить также:

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

проблема с java.ленг.NoSuchMethodError на моей стороне. Конфигурация ProGuard удаляла несколько методов.