2015-03-23 6 views
11

Ho una sottoclasse di android.support.v7.widget.RecyclerView. Funziona bene quando uso l'applicazione e il test.java.lang.IncompatibleClassChangeError quando include espresso-contrib: 2.0

Tuttavia, quando includo espresso-contrib nel mio file dell'app gradle ottengo un'eccezione quando provo a eseguire gli stessi test. L'app funziona ancora. Lo stesso problema si verifica in entrambe le versioni sdk 21 e 22, su emulatore e dispositivo armv. Usando un emulatore x86 invece seguraults.

Gradle

androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.0' 

Eccezione

java.lang.IncompatibleClassChangeError: xxx.DashboardActivity$1 
at dalvik.system.DexFile.defineClassNative(Native Method) 
at dalvik.system.DexFile.defineClass(DexFile.java:226) 
at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219) 
at dalvik.system.DexPathList.findClass(DexPathList.java:321) 
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:469) 
at xxx.DashboardActivity.onCreate(DashboardActivity.java:54) 
at android.app.Activity.performCreate(Activity.java:5990) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
at android.support.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:346) 
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
at android.app.ActivityThread.access$800(ActivityThread.java:151) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:135) 
at android.app.ActivityThread.main(ActivityThread.java:5257) 
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) 

adb logcat

I/ActivityManager(1229): START u0 {act=android.intent.action.MAIN flg=0x14000000 cmp=xxx/.activities.DashboardActivity} from uid 10059 on display 0 
V/WindowManager(1229): addAppToken: AppWindowToken{65964e3 token=Token{3f63d512 ActivityRecord{19743c9d u0 xxx/.activities.DashboardActivity t13}}} to stack=1 task=13 at 0 
D/LifecycleMonitor(2953): Lifecycle status change: [email protected] in: PRE_ON_CREATE 
V/WindowManager(1229): Adding window Window{2d974c1a u0 Starting xxx} at 2 of 7 (after Window{27a98488 u0 com.android.launcher/com.android.launcher2.Launcher}) 
W/RecyclerView(2953): setScrollingTouchSlop(): bad argument constant 315513600; using default value 
W/art  (2953): Incompatible structural change detected: Structural change of android.support.v7.widget.RecyclerView$Adapter is hazardous (/data/dalvik-cache/x86/[email protected]@[email protected] 
[email protected] at compile time, /data/dalvik-cache/x86/[email protected]@[email protected]@classes.dex at runtime): Virtual method count off: 26 vs 25 
W/art  (2953): Landroid/support/v7/widget/RecyclerView$Adapter; (Compile time): 
W/art  (2953): Static fields: 
W/art  (2953): Instance fields: 
W/art  (2953): Z mHasStableIds 
W/art  (2953): Landroid/support/v7/widget/RecyclerView$AdapterDataObservable; mObservable 
W/art  (2953): Direct methods: 
W/art  (2953): <init>()V 
W/art  (2953): Virtual methods: 
W/art  (2953): bindViewHolder(Landroid/support/v7/widget/RecyclerView$ViewHolder;I)V 
W/art  (2953): createViewHolder(Landroid/view/ViewGroup;I)Landroid/support/v7/widget/RecyclerView$ViewHolder; 
W/art  (2953): getItemCount()I 
W/art  (2953): getItemId(I)J 
W/art  (2953): getItemViewType(I)I 
W/art  (2953): hasObservers()Z 
W/art  (2953): hasStableIds()Z 
W/art  (2953): notifyDataSetChanged()V 
W/art  (2953): notifyItemChanged(I)V 
W/art  (2953): notifyItemInserted(I)V 
W/art  (2953): notifyItemMoved(II)V 
W/art  (2953): notifyItemRangeChanged(II)V 
W/art  (2953): notifyItemRangeInserted(II)V 
W/art  (2953): notifyItemRangeRemoved(II)V 
W/art  (2953): notifyItemRemoved(I)V 
W/art  (2953): onAttachedToRecyclerView(Landroid/support/v7/widget/RecyclerView;)V 
W/art  (2953): onBindViewHolder(Landroid/support/v7/widget/RecyclerView$ViewHolder;I)V 
W/art  (2953): onCreateViewHolder(Landroid/view/ViewGroup;I)Landroid/support/v7/widget/RecyclerView$ViewHolder; 
W/art  (2953): onDetachedFromRecyclerView(Landroid/support/v7/widget/RecyclerView;)V 
W/art  (2953): onFailedToRecycleView(Landroid/support/v7/widget/RecyclerView$ViewHolder;)Z 
W/art  (2953): onViewAttachedToWindow(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V 
W/art  (2953): onViewDetachedFromWindow(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V 
W/art  (2953): onViewRecycled(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V 
W/art  (2953): registerAdapterDataObserver(Landroid/support/v7/widget/RecyclerView$AdapterDataObserver;)V 
W/art  (2953): setHasStableIds(Z)V 
W/art  (2953): unregisterAdapterDataObserver(Landroid/support/v7/widget/RecyclerView$AdapterDataObserver;)V 
W/art  (2953): Landroid/support/v7/widget/RecyclerView$Adapter; (Runtime): 
W/art  (2953): Static fields: 
W/art  (2953): Instance fields: 
W/art  (2953): Z mHasStableIds 
W/art  (2953): Landroid/support/v7/widget/RecyclerView$AdapterDataObservable; mObservable 
W/art  (2953): Direct methods: 
W/art  (2953): <init>()V 
W/art  (2953): Virtual methods: 
W/art  (2953): bindViewHolder(Landroid/support/v7/widget/RecyclerView$ViewHolder;I)V 
W/art  (2953): createViewHolder(Landroid/view/ViewGroup;I)Landroid/support/v7/widget/RecyclerView$ViewHolder; 
W/art  (2953): getItemCount()I 
W/art  (2953): getItemId(I)J 
W/art  (2953): getItemViewType(I)I 
W/art  (2953): hasObservers()Z 
W/art  (2953): hasStableIds()Z 
W/art  (2953): notifyDataSetChanged()V 
W/art  (2953): notifyItemChanged(I)V 
W/art  (2953): notifyItemInserted(I)V 
W/art  (2953): notifyItemMoved(II)V 
W/art  (2953): notifyItemRangeChanged(II)V 
W/art  (2953): notifyItemRangeInserted(II)V 
W/art  (2953): notifyItemRangeRemoved(II)V 
W/art  (2953): notifyItemRemoved(I)V 
W/art  (2953): onAttachedToRecyclerView(Landroid/support/v7/widget/RecyclerView;)V 
W/art  (2953): onBindViewHolder(Landroid/support/v7/widget/RecyclerView$ViewHolder;I)V 
W/art  (2953): onCreateViewHolder(Landroid/view/ViewGroup;I)Landroid/support/v7/widget/RecyclerView$ViewHolder; 
W/art  (2953): onDetachedFromRecyclerView(Landroid/support/v7/widget/RecyclerView;)V 
W/art  (2953): onViewAttachedToWindow(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V 
W/art  (2953): onViewDetachedFromWindow(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V 
W/art  (2953): onViewRecycled(Landroid/support/v7/widget/RecyclerView$ViewHolder;)V 
W/art  (2953): registerAdapterDataObserver(Landroid/support/v7/widget/RecyclerView$AdapterDataObserver;)V 
W/art  (2953): setHasStableIds(Z)V 
W/art  (2953): unregisterAdapterDataObserver(Landroid/support/v7/widget/RecyclerView$AdapterDataObserver;)V 
I/art  (2953): Rejecting re-init on previously-failed class java.lang.Class<xxx.models.JSONArrayRecyclerViewAdapter> 
I/art  (2953): Rejecting re-init on previously-failed class java.lang.Class<xxx.models.JSONArrayRecyclerViewAdapter> 
I/art  (2953): Rejecting re-init on previously-failed class java.lang.Class<xxx.activities.DashboardActivity$1> 
I/art  (2953): Rejecting re-init on previously-failed class java.lang.Class<xxx.activities.DashboardActivity$1> 
D/AndroidRuntime(2953): Shutting down VM 
E/MonitoringInstrumentation(2953): Exception encountered by: Thread[main,5,main]. Dumping thread state to outputs and pining for the fjords. 
E/MonitoringInstrumentation(2953): java.lang.IncompatibleClassChangeError: xxx.activities.DashboardActivity$1 
E/MonitoringInstrumentation(2953):  at dalvik.system.DexFile.defineClassNative(Native Method) 
E/MonitoringInstrumentation(2953):  at dalvik.system.DexFile.defineClass(DexFile.java:226) 
E/MonitoringInstrumentation(2953):  at dalvik.system.DexFile.loadClassBinaryName(DexFile.java:219) 
E/MonitoringInstrumentation(2953):  at dalvik.system.DexPathList.findClass(DexPathList.java:321) 
E/MonitoringInstrumentation(2953):  at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:54) 
E/MonitoringInstrumentation(2953):  at java.lang.ClassLoader.loadClass(ClassLoader.java:511) 
E/MonitoringInstrumentation(2953):  at java.lang.ClassLoader.loadClass(ClassLoader.java:469) 
E/MonitoringInstrumentation(2953):  at xxx.activities.DashboardActivity.onCreate(DashboardActivity.java:54) 
E/MonitoringInstrumentation(2953):  at android.app.Activity.performCreate(Activity.java:5990) 
E/MonitoringInstrumentation(2953):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
E/MonitoringInstrumentation(2953):  at android.support.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:346) 
E/MonitoringInstrumentation(2953):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
E/MonitoringInstrumentation(2953):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2390) 
E/MonitoringInstrumentation(2953):  at android.app.ActivityThread.access$800(ActivityThread.java:151) 
E/MonitoringInstrumentation(2953):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
E/MonitoringInstrumentation(2953):  at android.os.Handler.dispatchMessage(Handler.java:102) 
E/MonitoringInstrumentation(2953):  at android.os.Looper.loop(Looper.java:135) 
E/MonitoringInstrumentation(2953):  at android.app.ActivityThread.main(ActivityThread.java:5257) 
E/MonitoringInstrumentation(2953):  at java.lang.reflect.Method.invoke(Native Method) 
E/MonitoringInstrumentation(2953):  at java.lang.reflect.Method.invoke(Method.java:372) 
E/MonitoringInstrumentation(2953):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
E/MonitoringInstrumentation(2953):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
+1

Sembra" onFailedToRecycleView (Landroid/supporto/v7/widget/RecyclerView $ ViewHolder;) 'è la differenza. La mia ipotesi è che contrib-espresso provi a sostituire una classe o un'interfaccia ma non implementa tutti i metodi? Ancora non so come aggiustarlo. – seppo0010

risposta

12

Espresso dipendenza non è aggiornato. Segnalato e verrà risolto in futuro. https://code.google.com/p/android-test-kit/issues/detail?id=139

+1

eventuali aggiornamenti su questo? –

+0

Esiste invece una soluzione alternativa? –

+1

@JohnShelley Sono stato in grado di aggirare il problema escludendo il modulo Recyclerview che la libreria espresso-contrib tenta di utilizzare. androidTestCompile ('com.android.support.test.espresso: espresso-contrib: 2.2') { esclude modulo: 'support-annotations' esclude modulo: 'recyclerview-v7' } – jacobduron

0

si prega di utilizzare Newest Gradle Plugin (non è una versione stabile)

Partendo 2.0.0 di Android Gradle Plugin, Gradle costruzione fallirà se il principale APK e il test APK utilizzano la stessa libreria (ad esempio Guava) ma in diverse versioni.

Per rendere la build successo, basta aggiungere una dipendenza per la versione più recente al build.gradle

ad esempio:

androidTestCompile "com.android.support:recyclerview-v7:${supportLibVersion}" 

di riferimento:

0

Si può cercare di aggiungere che alla fine del file Gradle (dopo ogni char)

/* 
Resolves dependency versions across test and production APKs, specifically, transitive 
dependencies. This is required since Espresso internally has a dependency on support-annotations. 
*/ 
configurations.all { 
    resolutionStrategy.force "com.android.support:support-annotations:$rootProject.supportLibraryVersion" 
} 

/* 
All direct/transitive dependencies shared between your test and production APKs need to be 
excluded from the test APK! This is necessary because both APKs will contain the same classes. Not 
excluding these dependencies from your test configuration will result in an dex pre-verifier error 
at runtime. More info in this tools bug: (https://code.google.com/p/android/issues/detail?id=192497) 
*/ 
configurations.compile.dependencies.each { compileDependency -> 
    println "Excluding compile dependency: ${compileDependency.getName()}" 
    configurations.androidTestCompile.dependencies.each { androidTestCompileDependency -> 
     configurations.androidTestCompile.exclude module: "${compileDependency.getName()}" 
    } 
} 

E 'dal progetto Android-test su github

Fonte: https://github.com/googlecodelabs/android-testing/blob/master/app/build.gradle#L96

0

Forse hai dimenticato di aggiungere testInstrumentationRunner android.support.test.runner.AndroidJUnitRunner "in un defaultConfig {}

Problemi correlati