Какой пакет для MultiDexTestRunner? android.support.multidex или com.android.test.runner
Страница http://developer.android.com/tools/building/multidex.html#testing
советует
dependencies {
compile 'com.android.support:multidex:1.0.1'
androidTestCompile 'com.android.support:multidex-instrumentation:1.0.1'
}
android {
defaultConfig {
multiDexEnabled true
testInstrumentationRunner "android.support.multidex.MultiDexTestRunner"
}
}
Но это вызывает исключение ClassNotFoundException при выполнении тестов.
Документация API и dexdump показывают, что существует com.android.test.runner.MultiDexTestRunner.
Итак, если я не верю в документацию и вместо этого укажу
dependencies {
compile 'com.android.support:multidex:1.0.1'
androidTestCompile 'com.android.support:multidex-instrumentation:1.0.1'
}
android {
defaultConfig {
multiDexEnabled true
testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
}
}
Тогда я получаю
com/company/myapp/MyApp; had used a different Landroid/support/multidex/MultiDexApplication; during pre-verification
...
IllegalAccessExceptionIllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
Я подозреваю, что страница документа неверна, и правильный путь - com.android.test.runner.MultiDexTestRunner... плюс у меня есть еще одна проблема.
Обратите внимание, что приложение multidex отлично работает. Каким-то образом второй тест MultiDexApplication включен в тест apk.
Вопросы:
Каков правильный путь для MultiDexTestRunner?
Почему я получаю второй MultiDexApplication в тестовом apk?
Ответы
Ответ 1
UPDATE: здесь исправление. Это общий шаблон, когда вы видите такое сообщение об ошибке had used a different L<package>; during pre-verification
, вам нужно исключить пакет при запуске теста.
build.gradle
android {
// ...
defaultConfig {
// ...
multiDexEnabled true
testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
}
}
dependencies {
// ...
// Need to exclude this when running test
androidTestCompile('com.android.support:multidex-instrumentation:1.0.1') {
exclude group: 'com.android.support', module: 'multidex'
}
}
Application.java
public class Application extends android.app.Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
Ответ 2
Примечание.. Когда вы пишете контрольно-измерительные тесты для приложений с несколькими приложениями, дополнительная настройка не требуется, если вы используете измерительную аппаратуру MonitoringInstrumentation (или AndroidJUnitRunner).
Таким образом, не используйте MultiDexTestRunner, который устарел; вместо этого используйте AndroidJUnitRunner. (Это относится к библиотеке поддержки multidex v1.0.2 +)
android {
// ...
defaultConfig {
// ...
multiDexEnabled true
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
Только если у вас есть пользовательская реализация тестового загрузочного бутстрапа с помощью:
public void onCreate(Bundle arguments) {
MultiDex.install(getTargetContext());
super.onCreate(arguments);
...
}
Смотрите: https://developer.android.com/studio/build/multidex.html#testing
Ответ 3
Точные проблемы, описанные в исходном вопросе, могут быть связаны с более старыми версиями. Я добавляю свой опыт здесь, потому что это один из первых хитов Google при исследовании проблемы.
В последних версиях инструментов и плагинов для Android вам не нужно ничего, кроме этого в build.gradle
:
...
android {
...
defaultConfig {
...
testInstrumentationRunner "com.android.test.runner.MultiDexTestRunner"
}
}
(у меня есть com.android.tools.build:gradle:1.5.0
)
EDIT: Как отметил igor-ganapolsky, MultiDexTestRunner устарел.
У меня нет доступа к источникам, где это уже появилось, но я подозреваю, что проблемы с MultiDexTestRunner возникают, когда вся настройка тестирования проекта нуждается в капитальном ремонте.
Документация указывает на новую библиотеку поддержки тестирования в качестве решения