2015-12-08 15 views
6

Gần đây tôi cần phải kiểm tra RecyclerView và tôi gặp rất nhiều rắc rối để làm bất cứ điều gì với nó.Kiểm tra recyclerXem với Espresso, cách thực hiện nhấp chuột hoặc xác nhận

Trước hết tôi biết rằng Espresso đã "hỗ trợ" RecyclerViews bằng cách cung cấp cho chúng tôi RecyclerViewActions nằm trong espresso-contrib. Vì vậy, tôi đã quyết định sử dụng nó và các phụ thuộc của tôi trông giống như vậy:

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" 
} 

Nhưng chỉ khi tôi thử chạy thử nghiệm sau khi thay đổi espresso-core để pha cà phê. Tôi có thể thấy lỗi này:

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

Tôi đã cố gắng google. Tôi đã thấy nhiều chủ đề mà mọi người đưa ra phản hồi như this one. Vì vậy, tôi loại trừ appcompat, supportv4 và recyclerview-v7. Giống như:

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' 
    } 

Và các thử nghiệm bắt đầu nhưng ... Tôi không thể sử dụng bất kỳ RecyclerViewActions nào. Bởi vì không có phương pháp nào sau khi loại bỏ recyclerview-v7 những gì được đề nghị hầu như ở khắp mọi nơi tôi thấy trên web. Khi tôi cố gắng sử dụng - RecyclerViewActions.actionOnItemAtPosition - phương pháp đó là cốt lõi cho tôi, tôi nhận được lỗi này:

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) 

Vì vậy, tôi muốn có này recyclerview-v7 thay vì loại trừ nó. Tôi sửa đổi nhập khẩu espresso-contrib tôi để:

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' 
    } 

Chạy thử một lần nữa nhưng ... Tôi nhận được lỗi ở đâu đó trong các bài kiểm tra:

android.view.InflateException: Binary XML file line #36: Error inflating class android.support.design.widget.NavigationView 

Vì vậy, tôi đang sử dụng libs gần đây nhất trong gradle tôi:

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' 

Và NavigationView đang sử dụng RecyclerView 23.1.1 mới nhất. Tôi cố gắng để tìm thấy những gì là sai vì vậy tôi hiển thị phụ thuộc của espresso-contrib bằng cách sử dụng ứng dụng ./gradlew: phụ thuộc vào giao diện điều khiển và tôi có thể thấy:

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

Được rồi vì vậy espresso-contrib-2.2.1 là mới nhất một đang sử dụng com.android.support:recyclerview-v7:23.0.1 - không phải phiên bản mới nhất của recyclerView và nó đang gây ra lỗi. Tôi quyết định cập nhật nó bên espresso-contrib bằng cách thêm:

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

tôi sử dụng ứng dụng: phụ thuộc một lần nữa và tôi có thể thấy sự thay đổi:

\--- com.android.support:recyclerview-v7:23.0.1 -> 23.1.1 (*) 

tôi bắt đầu kiểm tra một lần nữa. Và tôi không gặp lỗi với NavigationView nữa - Tôi nghĩ rằng nó đã được giải quyết nhưng ... một lỗi khác xuất hiện:

android.view.InflateException: Binary XML file line #21: Error inflating class android.support.v7.widget.Toolbar 

Và bây giờ tôi có một chút ý tưởng. Khi bạn nhìn vào phụ thuộc của espresso-contrib nó không sử dụng bất cứ điều gì có thể sử dụng thanh công cụ theo ý kiến ​​của tôi. Thanh công cụ là một phần của appcompat-v7 vì vậy tôi cố gắng thêm nó theo cách tương tự như tôi đã nâng cấp recyclerView lên phiên bản mới nhất. Vì vậy, tôi thêm:

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

Nhưng nó không giúp tôi. Và tôi bị mắc kẹt.

Bạn có gặp phải những vấn đề đó không? Bạn có cách giải quyết nào về cách bấm vào recyclerView không? Làm thế nào để kiểm tra xem mục trong recyclerView có văn bản hoặc một cái gì đó như thế? Tất cả các giải pháp tôi đã tìm thấy trên web đang sử dụng phương pháp: findViewHolderForPosition mà tôi không thể sử dụng sau khi loại trừ mô-đun recyclerview-v7. Giống như:

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

hoặc

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

trở lên.

Trả lời

2

Vấn đề với Thanh công cụ được gây ra bởi thực tế, một số libs tôi sử dụng trong tập tin app.gradle của tôi không có RecyclerView gần đây nhất vì vậy tôi cần phải thêm thêm:

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

Vấn đề với java.lang.NoSuchMethodError đang ở bên cạnh tôi. Cấu hình ProGuard đang xóa một vài phương thức.

+0

Hi F1sher, vui mừng vì bạn đã giải quyết được vấn đề của mình. Tôi có một vấn đề tương tự với 'NoSuchMethodError' trong' RecyclerViewActions'. Bạn có thể vui lòng cụ thể hơn và chia sẻ quy tắc Proguard nào được thêm hoặc xóa để làm cho nó hoạt động không? Có lẽ bạn có thể giúp nhiều người theo cách đó – mdelolmo

+4

Cuối cùng tôi đã tự tìm ra. Thêm quy tắc '-keep class android.support.v7.widget.RecyclerView {*; } 'không lừa. Tuy nhiên, Kudos cho F1sher cho gợi ý. – mdelolmo

+0

Có nói chung, vấn đề đó xảy ra rất thường xuyên. Bạn cần phải giữ một số lớp trong proguard đôi khi. – F1sher

Các vấn đề liên quan