Как заставить современный Multidex работать с инструментальными тестами на старых API

#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

  1. Это работает только тогда, когда вы не переопределяете класс приложения в коде. В противном случае ваш класс приложения должен расширяться MultiDexApplication , как описано в документации

  2. Теперь тесты будут найдены, но будут сброшены, я решил проблему, сохранив классы тестовых тестов в первом 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, которые мне нужно исправить.