Я следую старому руководству по 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:...
Поэтому, поиграв больше, я попытался понизить версию библиотеки espresso-contrib
и espresso-core
. Итак, мой тест пытается запуститься, но файлы, так как методы отсутствуют. Как получить правильную версию эспрессо, соответствующую моему SDK?
Пробовал 3.0.1, 3.0.0 и 2.2.2. Последний компилируется, но не может выполнить мою функцию. скорее всего потому что старый
Почему бы вам не попробовать AndroidX
артефакт?
@JeelVankhede Мне придется посмотреть, что это значит. Я делаю то, что делаю, следуя онлайн-руководству. Так что, возможно, это лучший способ, который откроется мне позже.
Все, что я хочу сказать, это попробовать Переход на AndroidX и проверить, решается ли проблема, поскольку это последние зависимости для библиотек поддержки.
По сути, ошибка говорит вам, что разные части вашего кода (основной код и тестовый код 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 - у вас проблемы. Потому что вам нужно будет выбрать один, и либо ваше приложение, либо зависимая библиотека могут потерять что-то из того, на что они полагались.
Пара ссылок об этом
Устранение неполадок с разрешением зависимостей
Последний довольно длинный, в вашем случае вы можете заставить свое основное приложение использовать последние версии библиотек поддержки (например, implementation 'com.android.support:appcompat-v7:28.0.0'
). Это может потребовать от вас также обновить compileSdk
/ targetSdk
, пожалуйста, обратите внимание на предупреждения и ошибки.
Вы можете найти последние версии здесь или воспользоваться помощниками из Android Studio.
Единственный совет: старайтесь ничего не импортировать из пакетов AndroidX, так как у вас не может быть зависимостей как от AndroidX, так и от других. Их легко найти: они начинаются с androidx
, примеры можно найти здесь
Я обязательно прочитаю, что смогу. Учебник признает, что это происходит, и смягчает это, добавляя определенные зависимости в androidTestImplementation и/или исключения. Разница для меня в том, что я использую более новую версию AndroidStudio, но это не должно иметь к этому большого отношения. Скорее всего, я просто скомпилирую с большей версией SDK, чтобы продолжить. Спасибо еще раз.
Альтернативой является понижение зависимостей 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
У меня было это в комментарии. Я получаю ошибки, если перехожу на эспрессо 2.2.2, но методы, которые я использую, там не существуют, поэтому я получаю сообщение об ошибке onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());
Согласно этому сообщению, в Espresso 2.2.2 должны быть действия с ящиками. Может попробовать повторно импортировать? Developersjournal.in/steps-to-setup-espresso-for-android-apps
Или вы можете опубликовать свое тестовое приложение (или его часть) на github? Потому что это похоже на конкретную проблему с конфигурацией проекта.
Думаю, я понял. Мне просто нужно было добавить еще несколько исключений в espresso-contrib
: «appcompat-v7», «design», «support-compat», «recyclerview-v7», «support-core-utils». После этого тест работает как задумано. Думаю, мне просто нужно было продолжать читать отладку, чтобы понять, что я добавил недостаточно. Теперь я могу продолжить тренировки. Так или иначе, чтобы помочь мне получить ответ. Спасибо за ваше время в этом занятом теге
Круто, хорошего настроения! Буду признателен, если вы примете ответ. Удаленная отладка — вещь непростая :)
Если это окажется обманом, я надеюсь на объяснение, а не просто фрагмент кода без контекста. Все еще зеленый в этом и не хочу кусать код и убегать