Подтвердить что ты не робот

Какой пакет для 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?

4b9b3361

Ответ 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 возникают, когда вся настройка тестирования проекта нуждается в капитальном ремонте.

Документация указывает на новую библиотеку поддержки тестирования в качестве решения