2014-10-21 2 views
0

У меня есть проект, который использует SlidingUpPanelLayout, но мне нужно было начать писать автоматические тесты с использованием Robolectric. Когда я представил Robolectric в проект, мои тесты на основе эспрессо не запускались. Я бы получил java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation, когда система попытается раздуть SlidingUpPanelLayout.SlidingUpPanelLayout противоречит Robolectric

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.marcthomas.testrobolectric/com.marcthomas.testrobolectric.MyActivity}: android.view.InflateException: Binary XML file line #11: Error inflating class com.sothree.slidinguppanel.SlidingUpPanelLayout 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) 
    at android.app.ActivityThread.access$800(ActivityThread.java:135) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5001) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.view.InflateException: Binary XML file line #11: Error inflating class com.sothree.slidinguppanel.SlidingUpPanelLayout 
    at android.view.LayoutInflater.createView(LayoutInflater.java:620) 
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:696) 
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:755) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
    at android.view.LayoutInflater.inflate(LayoutInflater.java:353) 
    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:290) 
    at android.app.Activity.setContentView(Activity.java:1929) 
    at com.marcthomas.testrobolectric.MyActivity.onCreate(MyActivity.java:14) 
    at android.app.Activity.performCreate(Activity.java:5231) 
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
    at com.google.android.apps.common.testing.testrunner.GoogleInstrumentation.callActivityOnCreate(GoogleInstrumentation.java:428) 
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148) 
    ... 11 more 
Caused by: java.lang.reflect.InvocationTargetException 
    at java.lang.reflect.Constructor.constructNative(Native Method) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
    at android.view.LayoutInflater.createView(LayoutInflater.java:594) 
    ... 23 more 
Caused by: java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation 
    at com.sothree.slidinguppanel.ViewDragHelper.<init>(ViewDragHelper.java:392) 
    at com.sothree.slidinguppanel.ViewDragHelper.create(ViewDragHelper.java:348) 
    at com.sothree.slidinguppanel.ViewDragHelper.create(ViewDragHelper.java:361) 
    at com.sothree.slidinguppanel.SlidingUpPanelLayout.<init>(SlidingUpPanelLayout.java:334) 
    at com.sothree.slidinguppanel.SlidingUpPanelLayout.<init>(SlidingUpPanelLayout.java:263) 
    ... 26 more 

Если удалить SlidingUpPanelLayout из моего файла activity_my.xml макета в проекте тесты будут работать успешно снова, так что, похоже, что-то делать с этими двумя компонентами как-то.

Я создал демонстрационный проект на github, который демонстрирует это поведение. Клонирование кода и запуск ./gradlew connectedAndroidTest воспроизведет эту проблему.

ответ

0

Чтобы исправить это мне нужно, чтобы добавить

exclude module: 'support-v4' 

в список не включает в Gradle файла модуля приложения, где androidTestCompile для robolectric объявлена. См. Объяснение ниже.

Эта ошибка была связана с ошибкой конфигурации Gradle. Причина в том, что в сборке многократно объявлены зависимости, и один из них должен быть исключен.

Чтобы решить эту проблему, посмотрите на последнюю часть исключения.

ViewDragHelper был виновником, поэтому, если в вашей среде IDE (Android Studio) откройте поиск имени класса (Command-O в OS X) и введите ViewDragHelper. Вы увидите, что есть несколько Jars, которые возвращаются. Вам нужно будет исключить тот, который вы не хотите.

В этой ситуации мы имели android-19 SDK, support-v4-19 и support-v4-20 и library-2.0.1 (библиотека slideuppanellayout), чтобы решить эту проблему мне нужно exclude support-v4.

Так что в файле градиента построения для проекта, где я включил robolectric, мне нужно было добавить следующее в список исключений.

exclude module: 'support-v4'

Смежные вопросы