Java.lang.IncompatibleClassChangeError при включении espresso-contrib: 2.0

У меня есть подкласс android.support.v7.widget.RecyclerView. Он отлично работает, когда я использую приложение и тестирование.

Однако, когда я включаю espresso-contrib в мой файл приложения gradle, я получаю исключение, когда пытаюсь запустить те же тесты. Приложение все еще работает. Такая же проблема возникает и в версиях 21 и 22 sdk, и в эмуляторе и устройстве. Используя эмулятор x86, он вместо этого заменяется.

Gradle

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

исключение

 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: xxx.activities.DashboardActivity@281384ef 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/data@app@xxx-1@b ase.apk@classes.dex at compile time, /data/dalvik-cache/x86/data@app@xxx.test-1@base.apk@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) 

Solutions Collecting From Web of "Java.lang.IncompatibleClassChangeError при включении espresso-contrib: 2.0"

Эспрессо-зависимость устарела. Сообщается и будет исправлено в будущем. https://code.google.com/p/android-test-kit/issues/detail?id=139

Используйте новейший плагин Gradle (не стабильная версия)

Начиная с 2.0.0 Android Gradle Plugin, сборка Gradle завершится неудачно, если основной APK и тестовый APK будут использовать одну и ту же библиотеку (например, Guava), но в разных версиях.

Чтобы сделать сборку успешной, просто добавьте зависимость для более новой версии к build.gradle

например:

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

Справка:

  • Java.lang.IncompatibleClassChangeError при использовании espresso-contrib
  • Разрешение конфликтов между основным и тестовым APK

Вы можете попытаться добавить это в нижней части вашего файла gradle (после каждого символа)

 /* 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()}" } } 

Это из проекта тестирования Android на github

Источник: https://github.com/googlecodelabs/android-testing/blob/master/app/build.gradle#L96

Возможно, вы забыли добавить testInstrumentationRunner android.support.test.runner.AndroidJUnitRunner "в defaultConfig {}