尝试使用Espresso单击RecyclerView项时,没有虚拟方法findViewHolderForPosition(I)

问题描述 投票:6回答:2

我正在尝试做一个简单的浓缩咖啡测试,它会找到没有特定标签的RecyclerView中的第一个项目并点击它。为了达到这个目的,我将espresso-contrib添加到这样的项目中:

androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.2.2') {
    // Necessary to avoid version conflicts
    exclude group: 'com.android.support', module: 'appcompat'
    exclude group: 'com.android.support', module: 'design'
    exclude group: 'com.android.support', module: 'support-v4'
    exclude group: 'com.android.support', module: 'appcompat-v7'
    exclude group: 'com.android.support', module: 'support-annotations'
    exclude module: 'recyclerview-v7'
}

并在我的测试用例中编写了以下表达式:onView(withId(R.id.sresults_list_recycler)).perform(RecyclerViewActions.actionOnHolderItem(new FirstNotSoldOutMatcher(), click()).atPosition(1));

Matcher完美运行,RecyclerView滚动到目标项目。但后来我得到错误:

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.example-1/base.apk)
at android.support.test.espresso.contrib.RecyclerViewActions$ActionOnItemAtPositionViewAction.perform(RecyclerViewActions.java:288)
at android.support.test.espresso.contrib.RecyclerViewActions$ActionOnItemViewAction.perform(RecyclerViewActions.java:232)
at android.support.test.espresso.ViewInteraction$1.run(ViewInteraction.java:144)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:428)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

这看起来很奇怪。我在Google文档中读到findViewHolderForPosition方法现在已被弃用但它应该仍然存在。我也在应用程序中启用了multidex,但根据文档它支持开箱即用,所以也不应该是一个问题。

你知道这个测试有什么问题吗?

android android-espresso android-proguard
2个回答
8
投票

好吧,在我的情况下问题是在ProGuard缩小未使用的方法。禁用它进行测试有帮助。

对于未来的求职者 - 如果您不想为调试版本禁用proguard,则将此行添加到proguard配置中也应该有所帮助:

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

另请注意,此规则应添加到常规proguard文件(proguardFiles中列出的文件)而不是测试文件(声明为testProguardFile


2
投票

您可以将@ Bersh的答案和this answer结合起来,对要保留的内容更加严格:

-keep class android.support.v7.widget.RecyclerView  {
    public android.support.v7.widget.RecyclerView$ViewHolder findViewHolderForPosition(int);
}

没有理由保持整个RecyclerView课程。

Update:

或者当你不可避免地更新到AndroidX时:

-keep class androidx.recyclerview.widget.RecyclerView  {
    public androidx.recyclerview.widget.RecyclerView$ViewHolder findViewHolderForPosition(int);
}
© www.soinside.com 2019 - 2024. All rights reserved.