#android #android-multidex #android-instrumentation
#Android #android-multidex #android-инструментарий
Вопрос:
У меня есть приложение, настроенное с помощью Multidex, и, похоже, оно загружается и работает на старых API-интерфейсах Android, однако иногда я получаю ошибки от инструментального тестера, где он не может найти никаких тестов. Я могу найти подробную информацию о том, как добавить multidex в приложение для Android, но есть несколько решений в зависимости от используемой библиотеки поддержки, и ни одно из них, похоже, напрямую не касается запуска тестов с multidex с использованием текущих рекомендуемых библиотек AndroidX. На 19-м уровне API Android я в настоящее время получаю эту ошибку:
$ ./gradlew connectedCheck
> Task :app:connectedDebugAndroidTest
Starting 0 tests on API-19(AVD) - 4.4.2
com.android.build.gradle.internal.testing.ConnectedDevice > No tests found.[API-19(AVD) - 4.4.2] FAILED
No tests found. This usually means that your test classes are not in the form that your test runner
expects (e.g. don't inherit from TestCase or lack @Test annotations).
Запуск этого на эмуляторе с уровнем API 21 успешно запускает все тесты. У меня не включены Proguard или minify. Чтобы включить Multidex, я внес следующие изменения. Я добавил это в build.gradle приложения:
android {
defaultConfig {
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
multiDexEnabled true
}
}
dependencies {
implementation "androidx.multidex:multidex:2.0.1"
androidTestImplementation 'org.mockito:mockito-core:3.4.6'
androidTestImplementation 'com.linkedin.dexmaker:dexmaker:2.28.0'
androidTestImplementation 'com.linkedin.dexmaker:dexmaker-mockito:2.28.0'
}
Мой манифест определяет класс, который наследуется от androidx.multidex.MultiDexApplication
атрибута android:name.
Я видел упоминание о добавлении в AndroidManifest.xml для тестового приложения, но в настоящее время у меня нет явного манифеста для него, и, похоже, он был только в контексте старой библиотеки поддержки Android, а не AndroidX. Что мне нужно сделать, чтобы инструментальные тесты работали с Multidex и AndroidX на уровнях API 16-19?
Комментарии:
1. Вы нашли решение?
2. @vitalyster Нет, пока вы не опубликовали его. Я просто жил в темноте, предполагая, что все части моего приложения работают корректно для API уровня 19.
Ответ №1:
Мой манифест определяет класс, который наследуется от androidx.multidex.MultiDexApplication
-
Это работает только тогда, когда вы не переопределяете класс приложения в коде. В противном случае ваш класс приложения должен расширяться
MultiDexApplication
, как описано в документации -
Теперь тесты будут найдены, но будут сброшены, я решил проблему, сохранив классы тестовых тестов в первом dex, добавив это в
build.gradle
:
android {
...
buildTypes {
...
debug {
multiDexKeepProguard file('multidex-config.pro')
}
}
}
и multidex-config.pro
содержит:
-keep class androidx.test.** { *; }
Комментарии:
1. Вы попали в самую точку. Этот ответ работает с одной небольшой настройкой. Поскольку я использую Dagger Hilt в тестировании, мне также пришлось добавить
-keep class dagger.hilt.** { *; }
. Теперь я могу надежно и последовательно запускать инструментальные тесты на Android API 19. Фактически, из-за того, что я наконец смог получить эти результаты тестирования, я обнаружил ошибку в своем коде, затрагивающую только старые версии Android, которые мне нужно исправить.