当前位置:  开发笔记 > 编程语言 > 正文

使用Espresso测试recyclerView,如何执行单击或断言

如何解决《使用Espresso测试recyclerView,如何执行单击或断言》经验,为你挑选了0个好方法。

最近我需要测试RecyclerView,我在使用它时遇到了很多麻烦.

首先,我通过向我们提供位于espresso-contrib中的 RecyclerViewActions来了解Espresso已经"支持"RecyclerViews .所以我决定使用它,我的依赖关系看起来像这样:

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

所以我宁愿使用这个rec​​yclerview-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

所以我在我的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.我试着找出错误所以我通过在控制台中使用./gradlew app:dependencies来显示espresso-contrib的依赖关系,我可以看到:

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

好吧所以最近使用的espresso-contrib-2.2.1是使用com.android.support:recyclerview-v7:23.0.1 - 而不是最新版本的recyclerView,它导致错误.我决定通过添加以下内容在espresso-contrib内更新它:

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

我再次使用app:dependencies,我可以看到变化:

\--- 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升级到最新版本的方式相同.所以我补充说:

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

或者更多.

 

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有