2015-12-08 11 views
6

最近、私はRecyclerViewをテストする必要があり、何か問題が発生しています。エスプレッソでのリサイクルのテスト、クリックやアサーションの実行方法

まず、私はエスプレッソが既にespresso-contribにあるRecyclerViewActionsを提供することで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" 
} 

しかしとしてのみ、私はエスプレッソのcontribをするエスプレッソ・コアを変更した後、私のテストを実行してみてください。このエラーが表示されます:

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

私はそれを試してみました。私は人々がthis oneのような反応を出す多くのトピックを見ました。だから私は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' 
    } 

テストが始まりますが...私はRecyclerViewActionを使用できません。 recyclerview-v7を除外してもメソッドは存在しないので、Web上で見たほとんどの場所で推奨されているものがあります。 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) 

だから私はむしろ、このrecyclerview-V7の代わりに、それを除く必要があるだろう。私は私のエスプレッソ-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で最も最近のLIBSを使用しています:

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アプリを使って、エスプレッソの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 

わかりましたので、エスプレッソのcontrib-2.2.1最新のものですcom.android.support:recyclerview-v7:23.0.1を使用しています - 最新バージョンのrecyclerViewではなく、エラーが発生しています。私は追加することにより、エスプレッソ-contribの内側にそれを更新することを決定した:再び依存関係と私はチェンジ見ることができます:

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

私はアプリを使用

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

をそして今、私はアイデアを少ししています。あなたがエスプレッソの依存関係を見るとき、それは私の意見でツールバーを使用するかもしれないものを使用していません。ツールバーはappcompat-v7の一部ですので、私はrecyclerViewを最新のバージョンにアップグレードしたのと同じ方法で追加しようとしています。だから私は追加:

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

しかし、それは私を助けません。そして私は立ち往生している。

これらの問題に直面しましたか?あなたはrecyclerViewをクリックするための回避策がありますか? recyclerViewのアイテムにテキストなどがあるかどうかをチェックする方法私がウェブ上で見つけたすべてのソリューションは、メソッドを使用しています:私はrecyclerview-v7モジュールを除外して使用できないfindViewHolderForPositionです。同様に:

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

または

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

以上。ツールバーと

答えて

2

問題が起因している私も追加する必要ので、私は私のapp.gradleファイルで使用するLIBSのいくつかは、最新のRecyclerViewを持っていません。

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

問題java.lang.NoSuchMethodErrorが私の側にあります。 ProGuardの設定はいくつかの方法を削除していました。

+0

こんにちはF1sher、うれしいことにあなたの問題を解決しました。 'RecyclerViewActions'の' NoSuchMethodError'にも同様の問題があります。 Proguardのルールを追加したり、削除したりして、より具体的かつ共有することができますか?たぶんあなたは多くの人々にその方法を助けることができます – mdelolmo

+4

最後に私はそれを自分で見つけました。ルール '-keep classを追加するandroid.support.v7.widget.RecyclerView {*; } 'はトリックを行います。しかし、ヒントのためにF1sherへの賞賛。 – mdelolmo

+0

一般的に、この問題は非常に頻繁に起こります。あなたは時々プロガードでいくつかのクラスを保持する必要があります。 – F1sher

関連する問題