2016-09-29 2 views
5

के साथ रीसाइक्लर व्यू आइटम पर क्लिक करने का प्रयास करते समय मैं एक साधारण एस्प्रेसो परीक्षण करने की कोशिश कर रहा हूं जो RecyclerView में पहले आइटम को विशिष्ट लेबल के बिना मिलेगा और उस पर क्लिक करें। इस तरह परियोजना इस मैं espresso-contrib जोड़ा लक्ष्य को हासिल करने के लिए:कोई वर्चुअल विधि नहीं है ViewHolderForPosition (I) जब एस्प्रेसो

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 विधि अब बहिष्कृत है लेकिन यह अभी भी वहां होना चाहिए। मेरे पास ऐप में मल्टीडेक्स सक्षम है लेकिन दस्तावेज़ों के मुताबिक इसे बॉक्स से बाहर समर्थित किया गया है, इसलिए समस्या भी नहीं होनी चाहिए।

क्या आपको पता है कि इस परीक्षण में क्या गलत हो सकता है?

उत्तर

8

ठीक है, मेरे मामले में समस्या ProGuard अप्रयुक्त विधियों को कम करने में थी। परीक्षणों के लिए इसे अक्षम करने में मदद मिली।

भविष्य चाहने वालों के लिए - यदि आप config ProGuard को भी मदद करनी चाहिए इस लाइन को जोड़ने के लिए डीबग बिल्ड ProGuard निष्क्रिय करने के लिए नहीं करना चाहती:

-keepclasseswithmembers public class android.support.v7.widget.RecyclerView { *; } 
इसके अलावा

, ध्यान दें कि इस नियम नियमित ProGuard में जोड़ा जाना चाहिए फ़ाइल (proguardFiles में सूचीबद्ध एक) और परीक्षण एक नहीं (testProguardFile के रूप में घोषित)

+0

मुझे एक ही समस्या थी। यह समाधान काम करता है। धन्यवाद आदमी! –

+0

@ बर्श क्यों 'proguardFiles' में और 'testProguardFiles' में नहीं? वे सिर्फ परीक्षणों के लिए होना चाहिए ... – Caipivara

+0

@ कैपिवार जैसा कि मुझे याद है कि 'testProguardFiles' केवल परीक्षण कोड (टेस्ट एपीके में) के लिए लागू होते हैं, जबकि हमें ऐप में विधियों को रखने की आवश्यकता होती है – Bersh

संबंधित मुद्दे