2015-02-16 1 views
12

После обновления эспрессо до версии 2 ни один из моих модульных тестов не будет работать на устройствах с предварительным леоптипом. Смотрите ниже след:Тесты не выполняются после обновления эспрессо 2 (не удалось: запуск инструментария завершился неудачно из-за «java.lang.IllegalAccessError»)

15:07:07.627 [WARN] [org.gradle.api.Project] Tests on Samsung Galaxy S3 - 4.3 - API 18 - 720x1280 - 4.3 failed: Instrumentation run failed due to 'java.lang.IllegalAccessError' 
15:07:07.832 [WARN] [org.gradle.api.Project] 
com.android.builder.testing.ConnectedDevice > hasTests[Samsung Galaxy S3 - 4.3 - API 18 - 720x1280 - 4.3] FAILED 
15:07:07.832 [WARN] [org.gradle.api.Project] No tests found. 
15:07:07.834 [DEBUG] [org.gradle.api.Project] DeviceConnector 'Samsung Galaxy S3 - 4.3 - API 18 - 720x1280 - 4.3': uninstalling com.nordstrom.fla.test 
15:07:08.252 [DEBUG] [org.gradle.api.Project] DeviceConnector 'Samsung Galaxy S3 - 4.3 - API 18 - 720x1280 - 4.3': uninstalling com.nordstrom.fla 
15:07:08.666 [INFO] [org.gradle.api.Project] deleteDir(/Users/graemeharnish/workspace/fla-android/app/build/outputs/reports/androidTests/connected) returned: true 
15:07:08.702 [DEBUG] [org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter] Finished executing task ':app:connectedAndroidTest' 
15:07:08.702 [LIFECYCLE] [class org.gradle.TaskExecutionLogger] :app:connectedAndroidTest FAILED 

Трассировка стека в равной степени бесполезен

* Exception is: 
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:connectedAndroidTest'. 
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69) 
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46) 
    at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35) 
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64) 
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58) 
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:42) 
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52) 
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53) 
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43) 
    at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:305) 
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.executeTask(AbstractTaskPlanExecutor.java:79) 
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:63) 
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:51) 
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:23) 
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:88) 

Мои Gradle зависимости

dependencies { 
apt "org.robobinding:codegen:$robobindingVersion" 
compile "org.robobinding:robobinding:$robobindingVersion:with-aop" 
aspectPath("org.robobinding:robobinding:$robobindingVersion:with-aop") 

compile 'org.lucasr.twowayview:twowayview:0.1.4' 
compile 'com.android.support:support-v4:21.0.3' 
compile 'com.android.support:recyclerview-v7:21.0.3' 
provided 'com.android.support:appcompat-v7:21.0.3' 
compile 'net.hockeyapp.android:HockeySDK:3.5.0-b.4' 
compile 'me.dm7.barcodescanner:zbar:1.5' 
compile 'com.squareup.picasso:picasso:2.4.0' 
compile 'com.squareup:otto:1.3.5' 

compile 'org.apache.commons:commons-lang3:3.0' 

compile 'com.nispok:snackbar:2.8.0' 

compile 'com.rengwuxian.materialedittext:library:1.8.0' 
compile 'com.crittercism:crittercism-android-agent:+' 

provided 'org.roboguice:roboblender:3.+' 

compile 'com.android.support:cardview-v7:21.0.+' 
compile 'com.melnykov:floatingactionbutton:1.1.0' 

compile 'com.google.code.findbugs:jsr305:1.3.9' 
compile 'com.android.support:support-annotations:21.0.3' 

androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0' 
androidTestCompile 'com.android.support.test:testing-support-lib:0.1' 
androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.0' 

androidTestCompile('org.mockito:mockito-core:1.9.5', 
     'com.google.dexmaker:dexmaker-mockito:1.1', 
     'com.google.dexmaker:dexmaker:1.1') 

}

Что странно это работает на 5.0 устройств не проблема ,

+0

Вы понимаете это? –

ответ

9

Старые устройства испытывают проблемы при выполнении тестов, когда у вас есть такая же зависимость в приложении и тестовом приложении, которое использует приложение.

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

В моем случае это было как Dagger и Espresso в зависимости от javax.inject и это, как это может быть «фиксированным»:

androidTestCompile('com.android.support.test.espresso:espresso-core:2.0') { 
    exclude group: 'javax.inject' 
} 

Если включить более или более странную зависимость, вы можете посмотреть на this build.gradle.

При использовании эспрессо-вно, вам, возможно, придется сделать это:

androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.0') { 
    exclude group: 'javax.inject' 
    exclude group: 'com.android.support' 
} 
+0

Как вы выяснили, какие зависимости вызвали проблему? –

+0

@YoelGluschnaider Запуск 'gradlew dep' в модуле приложения показывает зависимости для задач' compile' и 'androidTestCompile'. Может быть, лучший способ, но я просто сравнил их и исключил из теста apk, который уже находится в app apk. –

5

Проблема обычно происходит, когда один и та же зависимость включена более чем один раз или с разными версиями.

У меня есть рабочий проект с использованием espresso2 с multidex для уровня api 14+.

Проверить this SO question. Принятый ответ очень помог.

В основном, используя зависимости ./gradlew -q: myproject: зависимости, вы можете проверить наличие дубликатов зависимостей или одну и ту же зависимость с разными версиями, включенными более одного раза.

Это пример моих зависимостей эспрессо, но мне пришлось изменить и исключить многие:

.... 
//Espresso 2 
androidTestCompile('com.android.support.test.espresso:espresso-core:2.0') { 
    exclude group: 'com.google.guava' 
    exclude module: 'espresso-idling-resource' 
} 
androidTestCompile('com.android.support.test:testing-support-lib:0.1') { 
    exclude group: 'com.google.guava' 
    exclude module: 'espresso-idling-resource' 
} 
testingCompile ('com.android.support.test.espresso:espresso-contrib:2.0') { 
    exclude group: 'com.google.guava' 
    exclude group: 'com.android.support', module: 'support-v4' 
} 
// Need to exclude this when running test 
androidTestCompile('com.android.support:multidex-instrumentation:1.0.1') { 
    exclude group: 'com.android.support', module: 'multidex' 
} 
.... 

./ Gradlew -q: MyProject: зависимости даст вам выход, как следующее для каждого варианта + аромат комбинации:

_prodTestingTestApk - ## Internal use, do not manually configure ## 
+--- com.android.support.test.espresso:espresso-core:2.0 
| +--- com.squareup:javawriter:2.1.1 
| +--- org.hamcrest:hamcrest-integration:1.1 
| | \--- org.hamcrest:hamcrest-core:1.1 
| +--- org.hamcrest:hamcrest-library:1.1 
| | \--- org.hamcrest:hamcrest-core:1.1 
| +--- javax.inject:javax.inject:1 
| +--- com.android.support.test:testing-support-lib:0.1 
| | \--- junit:junit-dep:4.10 
| |   \--- org.hamcrest:hamcrest-core:1.1 
| +--- com.google.code.findbugs:jsr305:2.0.1 
| +--- javax.annotation:javax.annotation-api:1.2 
| \--- org.hamcrest:hamcrest-core:1.1 
+--- com.android.support.test:testing-support-lib:0.1 (*) 
\--- com.android.support:multidex-instrumentation:1.0.1 
+0

Большое вам спасибо! Это была моя проблема. – rrbrambley

5

У меня была аналогичная проблема, когда я работала на в моих тестах RecyclerView которая была решена путем добавления ниже код build.gradle:

configurations { 
    androidTestCompile.exclude group: 'com.android.support', module: 'recyclerview-v7' 
} 

а также вы можете попробовать добавить следующие исключения, а также:

configurations { 
    androidTestCompile.exclude group: 'com.android.support', module: 'support-v4' 
} 

Таким образом, в build.gradle мой configurations похожий, что:

configurations { 
    androidTestCompile.exclude group: 'com.android.support', module: 'support-v4' 
    androidTestCompile.exclude group: 'com.android.support', module: 'recyclerview-v7' 
} 

Это решается как из вопросов, с которыми я столкнулся с: java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation и java.lang.NoClassDefFoundError. После этого я смог запустить тесты на устройствах с предварительным леоптипом. Подробнее here и here.

+0

Отлично! Благодаря ! – box