2016-09-29 1 views
5

最初のアイテムが RecyclerViewという特別なラベルなしで見つかるはずの簡単なエスプレッソテストをしようとしています。エスプレッソでRecyclerViewアイテムをクリックしようとすると仮想メソッドが見つからない

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

マッチャが完璧に動作してRecyclerViewがターゲット項目にスクロールしてしまったこれを実現するために、私はこのように投影するespresso-contribを追加しました。しかし、私はエラーが発生します:

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を有効にしているが、ドキュメントによれば、それはあまりにも問題ではないので、ボックスの外でサポートされています。

このテストで何が間違っているのでしょうか?

答えて

8

私の場合、問題はProGuardであり、未使用の方法が収縮していました。テストのためにそれを無効にすることが助けになりました。将来の求職者のために

- あまりにも役立つはずです、あなたは設定をProGuardのために、この行を追加するデバッグビルドのProGuardのを無効にしたくない場合は:

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

また、このルールは通常のProGuardのに追加されなければならないことに注意してくださいテストファイルではなく(testProguardFileとして宣言されている)

+0

私は同じ問題を抱えていました(proguardFilesに記載されています)。この解決策は働きます。 –

+0

@Bershなぜ 'proguardFiles'では' testProguardFiles'ではなく?彼らはテストのためだけでなければなりません... – Caipivara

+0

@Caipivara私は 'testProguardFiles'がテストコード(テストapk)にのみ適用可能であったことを覚えていますが、アプリケーション自体にメソッドを保持する必要があります – Bersh

関連する問題