Espresso 测试中 RecyclerView 的 NoSuchMethodError

NoSuchMethodError for RecyclerView in Espresso test

目前我正在尝试使用 RecyclerView 测试视图。应用程序运行良好,但在测试中,它没有找到 RecyclerView 的方法,以下是测试文件中的依赖项

androidTestCompile ('com.android.support.test.espresso:espresso-core:2.0') {
    exclude group: 'javax.inject'
    exclude group: 'com.google.code.findbugs'
    exclude group: 'com.android.support', module: 'support-v4'
}
androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.0') {
    exclude group: 'javax.inject'
    exclude group: 'com.google.guava'
    exclude group: 'com.android.support', module: 'support-annotations'
    exclude module: 'recyclerview-v7'
}

我在使用 RecyclerViewActions.actionOnItemAtPosition 时出错,它会调用 RecyclerView 的 scrollToPosition() 方法。但是它抱怨找不到这个方法:

java.lang.NoSuchMethodError: android.support.v7.widget.RecyclerView.scrollToPosition
at android.support.test.espresso.contrib.RecyclerViewActions$ScrollToPositionViewAction.perform(RecyclerViewActions.java:397)
at android.support.test.espresso.contrib.RecyclerViewActions$ActionOnItemAtPositionViewAction.perform(RecyclerViewActions.java:277)
at android.support.test.espresso.ViewInteraction.run(ViewInteraction.java:144)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
....

我认为问题是,因为它在应用程序中运行良好,所以在测试中,它可能使用比应用程序更旧的版本。对于测试依赖,recyclerView 的版本是 21.0.3,app 版本是 22.2.0。但是我把RecyclerView的app版本改成21.0.3后(和测试的一样),还是一样的报错。

非常感谢任何意见

好的,经过两天的搜索,终于找到了解决方案。它与Proguard有关。事实证明 RecyclerView 被 Android Proguard 混淆了。这就是为什么 Espresso 找不到这个方法的原因。

只需添加

-keep class android.support.v7.widget.RecyclerView { *; }

在 proguard-rules.text 然后就大功告成了。