Добавление espresso-contrib в androidTestImplementation создает ошибки зависимостей/ограничений

Я следую старому руководству по PluralSight: Расширение возможностей Android-приложений. Поскольку я использую более новую версию IDE, у меня возникли некоторые проблемы. Большинство я могу исправить здесь, в SO, но я застрял и у меня недостаточно опыта, кроме того, что я знаю.

При настройке некоторых модульных тестов мне пришлось добавить androidTestImplementation ('com.android.support.test.espresso:espresso-contrib:3.0.2' в файл градиента. Инструктор уклонился от этого, создав некоторые проблемы, поскольку

The espresso-contrib library is actually relying on different versions of certain classes than we are using in our application. Cause remember that gradle takes care of resolving down chain dependencies

Опыт ошибок в модуле был не тем, что я получал ниже. Они были исправлены добавлением явных вызовов библиотек в TestCompile. То, что я делаю то же самое, не решает проблему.

Cannot find a version of 'com.android.support:appcompat-v7' that satisfies the version constraints: 
   Dependency path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:24.2.1'
   Constraint path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:{strictly 24.2.1}' because of the following reason: debugRuntimeClasspath uses version 24.2.1
   Dependency path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:24.2.1'
   Dependency path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:24.2.1'
   Constraint path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:{strictly 24.2.1}' because of the following reason: debugRuntimeClasspath uses version 24.2.1
   Dependency path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:24.2.1'
   Dependency path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:24.2.1'
   Constraint path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:{strictly 24.2.1}' because of the following reason: debugRuntimeClasspath uses version 24.2.1
   Dependency path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:24.2.1'
   Dependency path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:24.2.1'
   Constraint path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:{strictly 24.2.1}' because of the following reason: debugRuntimeClasspath uses version 24.2.1
   Dependency path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:24.2.1'
   Dependency path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:24.2.1'
   Constraint path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:{strictly 24.2.1}' because of the following reason: debugRuntimeClasspath uses version 24.2.1
   Dependency path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:24.2.1'
   Dependency path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:24.2.1'
   Constraint path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:{strictly 24.2.1}' because of the following reason: debugRuntimeClasspath uses version 24.2.1
   Dependency path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:24.2.1'
   Dependency path 'NoteKeeper:app:unspecified' --> 'com.android.support:design:27.1.1' --> 'com.android.support:appcompat-v7:27.1.1'
   Dependency path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:24.2.1'
   Constraint path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:{strictly 24.2.1}' because of the following reason: debugRuntimeClasspath uses version 24.2.1
   Dependency path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:24.2.1'
   Dependency path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:24.2.1'
   Constraint path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:{strictly 24.2.1}' because of the following reason: debugRuntimeClasspath uses version 24.2.1
   Dependency path 'NoteKeeper:app:unspecified' --> 'com.android.support:appcompat-v7:24.2.1'

Мое приложение:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 24
    defaultConfig {
        applicationId "com.jwhh.jim.notekeeper"
        minSdkVersion 24
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:support-annotations:28.0.0'
    implementation 'com.android.support:appcompat-v7:24.2.1'
    implementation 'com.android.support:design:24.2.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:recyclerview-v7:24.2.1'
    implementation 'com.android.support:cardview-v7:24.2.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test:rules:1.0.2'
    androidTestImplementation ('com.android.support.test.espresso:espresso-core:3.0.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    androidTestImplementation 'com.android.support.test.espresso:espresso-contrib:3.0.2'
    androidTestImplementation 'com.android.support:appcompat-v7:24.2.1'
    androidTestImplementation 'com.android.support:design:24.2.1'
    androidTestImplementation 'com.android.support:cardview-v7:24.2.1'
}

Я искал решения здесь, но не нашел ничего подходящего.

Ошибка ресурсов, когда я добавляю espresso-contrib рассказал об изменении версии SDK. Все, что я сделал, было соответствовать 24, поэтому я не думаю, что изменение этого улучшит ситуацию. Возможно, я использую неправильные сборки эспрессо?

Тест эспрессо не запускается после добавления библиотеки espresso-contrib в gradle предполагает, что мне нужно добавить некоторые исключения, которые я пробовал следующим образом без очевидной разницы. Кроме того, не совсем уверен, что это должно делать.

    androidTestImplementation ('com.android.support.test.espresso:espresso-contrib:3.0.2', {
        exclude group: 'com.android.support', module: 'appcompat'
        exclude group: 'com.android.support', module: 'support-v4'
        exclude module: 'recyclerview-v7'
    })

Я порылся в Настройка эспрессо, но заблудился и не нашел предостережений, когда дело дошло до espresso-contrib


По совету пользователя я удалил лишние зависимости из androidTestImplementation, но все равно получаю ошибки

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:support-annotations:28.0.0'
    implementation 'com.android.support:appcompat-v7:24.2.1'
    implementation 'com.android.support:design:24.2.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation 'com.android.support:recyclerview-v7:24.2.1'
    implementation 'com.android.support:cardview-v7:24.2.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test:rules:1.0.2'
    androidTestImplementation ('com.android.support.test.espresso:espresso-core:3.0.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    androidTestImplementation 'com.android.support.test.espresso:espresso-contrib:3.0.2'
}

Cannot find a version of 'com.android.support:appcompat-v7' that satisfies the version constraints:...

Если это окажется обманом, я надеюсь на объяснение, а не просто фрагмент кода без контекста. Все еще зеленый в этом и не хочу кусать код и убегать

Matt 29.05.2019 05:25

Поэтому, поиграв больше, я попытался понизить версию библиотеки espresso-contrib и espresso-core. Итак, мой тест пытается запуститься, но файлы, так как методы отсутствуют. Как получить правильную версию эспрессо, соответствующую моему SDK?

Matt 01.06.2019 03:35

Пробовал 3.0.1, 3.0.0 и 2.2.2. Последний компилируется, но не может выполнить мою функцию. скорее всего потому что старый

Matt 01.06.2019 04:09

Почему бы вам не попробовать AndroidX артефакт?

Jeel Vankhede 03.06.2019 07:26

@JeelVankhede Мне придется посмотреть, что это значит. Я делаю то, что делаю, следуя онлайн-руководству. Так что, возможно, это лучший способ, который откроется мне позже.

Matt 04.06.2019 15:48

Все, что я хочу сказать, это попробовать Переход на AndroidX и проверить, решается ли проблема, поскольку это последние зависимости для библиотек поддержки.

Jeel Vankhede 04.06.2019 16:02
4
6
784
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По сути, ошибка говорит вам, что разные части вашего кода (основной код и тестовый код Android) зависят от разных версий библиотеки поддержки, в данном случае 24.2.1 и 27.1.1.

Что это значит?

Допустим, у вас есть какой-то класс InternalImportantThing. И ваш код зависит от v1 этого класса. А затем вы добавляете некоторую библиотеку (espresso-contrib в вашем случае), которая зависит от v2 этого класса.

Проблема в том, что у обоих классов один и тот же, скажем так, «путь». Например. com.myapp.InternalImportantThing. И вы не можете иметь их обоих в одном приложении, так как Classloader в этом случае сойдет с ума: «Какой класс выбрать: com.myapp.InternalImportantThing или com.myapp.InternalImportantThing?» (И да, они одинаковые - вот в чем проблема).

Вот почему вы должны разрешить конфликт. Есть разные способы сделать это, мы обсудим это позже.

Что происходит после разрешения?

Это зависит. Если v1 и v2 имеют одинаковый публичный API и отличаются только реализацией, все может работать хорошо. Или не может, если методы дают разные результаты для одних и тех же входных данных. Но если v2 не хватает некоторых API v1, а v1 не имеет чего-то из v2 - у вас проблемы. Потому что вам нужно будет выбрать один, и либо ваше приложение, либо зависимая библиотека могут потерять что-то из того, на что они полагались.

Пара ссылок об этом

Разрешение конфликтов Gradle

Устранение неполадок с разрешением зависимостей

Последний довольно длинный, в вашем случае вы можете заставить свое основное приложение использовать последние версии библиотек поддержки (например, implementation 'com.android.support:appcompat-v7:28.0.0'). Это может потребовать от вас также обновить compileSdk / targetSdk, пожалуйста, обратите внимание на предупреждения и ошибки.

Вы можете найти последние версии здесь или воспользоваться помощниками из Android Studio.

Единственный совет: старайтесь ничего не импортировать из пакетов AndroidX, так как у вас не может быть зависимостей как от AndroidX, так и от других. Их легко найти: они начинаются с androidx, примеры можно найти здесь

Я обязательно прочитаю, что смогу. Учебник признает, что это происходит, и смягчает это, добавляя определенные зависимости в androidTestImplementation и/или исключения. Разница для меня в том, что я использую более новую версию AndroidStudio, но это не должно иметь к этому большого отношения. Скорее всего, я просто скомпилирую с большей версией SDK, чтобы продолжить. Спасибо еще раз.

Matt 04.06.2019 18:04

Альтернативой является понижение зависимостей Espresso. Может с 2.2.2 попробовать? com.android.support.test.espresso:espresso-contrib:2.2.2 или даже 2.1, com.android.support.test.espresso:espresso-contrib:2.1 И то же самое для espresso-core

Gaket 04.06.2019 18:16

У меня было это в комментарии. Я получаю ошибки, если перехожу на эспрессо 2.2.2, но методы, которые я использую, там не существуют, поэтому я получаю сообщение об ошибке onView(withId(R.id.drawer_layout)).perform(DrawerActions.ope‌​n());

Matt 04.06.2019 18:42

Согласно этому сообщению, в Espresso 2.2.2 должны быть действия с ящиками. Может попробовать повторно импортировать? Developersjournal.in/steps-to-setup-espresso-for-android-app‌​s

Gaket 04.06.2019 23:56

Или вы можете опубликовать свое тестовое приложение (или его часть) на github? Потому что это похоже на конкретную проблему с конфигурацией проекта.

Gaket 04.06.2019 23:57

Думаю, я понял. Мне просто нужно было добавить еще несколько исключений в espresso-contrib: «appcompat-v7», «design», «support-compat», «recyclerview-v7», «support-core-utils». После этого тест работает как задумано. Думаю, мне просто нужно было продолжать читать отладку, чтобы понять, что я добавил недостаточно. Теперь я могу продолжить тренировки. Так или иначе, чтобы помочь мне получить ответ. Спасибо за ваше время в этом занятом теге

Matt 05.06.2019 00:11

Круто, хорошего настроения! Буду признателен, если вы примете ответ. Удаленная отладка — вещь непростая :)

Gaket 05.06.2019 14:59

Другие вопросы по теме