Как заставить Powermock работать с Dexmaker

Я пытаюсь включить Powermock в качестве зависимости для моих тестов Android, используя следующую конфигурацию build.gradle:

dependencies{
    compile 'com.android.support:appcompat-v7:21.0.+'
    androidTestCompile('org.mockito:mockito-core:1.9.5')
    androidTestCompile('com.google.dexmaker:dexmaker:1.2')
    androidTestCompile('com.google.dexmaker:dexmaker-mockito:1.2')
    androidTestCompile('org.powermock:powermock-module-junit4:1.5.5') {
        exclude module: 'junit'
    }
    androidTestCompile('org.powermock:powermock-api-mockito:1.5.5') {
        exclude module: 'mockito-all'
    }
}

Тем не менее, компилятор жалуется, что

Error:Gradle: Execution failed for task ':app:packageDebugTest'.
> Duplicate files copied in APK mockito-extensions/org.mockito.plugins.MockMaker
    File 1: ~/.gradle/caches/modules-2/files-2.1/com.google.dexmaker/dexmaker-mockito/1.2/b99884a4c6ef6335ba376f79aa79632b2421c17c/dexmaker-mockito-1.2.jar
    File 2: ~/.gradle/caches/modules-2/files-2.1/com.google.dexmaker/dexmaker-mockito/1.2/b99884a4c6ef6335ba376f79aa79632b2421c17c/dexmaker-mockito-1.2.jar

Рассматривая структуру банки, я заметил, что и Dexmaker, и Powermock объявляют MockMaker в mockito-extensions

IMG

Что такое MockMaker? Чем они отличаются? И самый важный вопрос: возможно ли заставить Powermock хорошо работать с Dexmaker?

Заранее спасибо. Любая помощь будет принята с благодарностью.

3 ответа

Решение

MockMaker - это клеевой модуль, который интегрирует dexmaker с Mockito. Он делает то, что необходимо для Mockito для генерации конкретных классов с файлами Dalvik .dex вместо файлов JVM .class.

Возможно, Powermock будет работать с Dexmaker, но вряд ли будут работать расширенные функции Powermock. В частности, Powermock рекламирует это:

PowerMock использует пользовательский загрузчик классов и манипуляции с байт-кодами, чтобы включить моделирование статических методов, конструкторов, конечных классов и методов, приватных методов, удаление статических инициализаторов и многое другое.

Этот пользовательский загрузчик классов вряд ли будет работать на dalvikvm.

Вы можете попытаться поместить это в свой build.gradle, это решило мне ту же проблему

android{
...

packagingOptions{
    exclude 'mockito-extensions/org.mockito.plugins.MockMaker'
}

...

}

У меня была такая же проблема, и я только что нашел решение здесь. Это включает в себя немного ручной работы, и вам придется изменить файл JAR самостоятельно.

Итак, nparihar предлагает следующее.

  1. Сделайте резервную копию powermock-api-mockito-1.5.5.jar
  2. Переименуйте powermock-api-mockito-1.5.5.jar в powermock-api-mockito-1.5.5.zip
  3. Разархивируйте powermock-api-mockito-1.5.5.zip
  4. cd powermock-api-mockito-1.5.5 /
  5. rm -rf mockito-extensions
  6. jar cf powermock-api-mockito-1.5.5.jar META-INF / org /
  7. поставь новую баночку в свои любимые.

Это решение сработало для меня. Дайте мне знать, если это работает и для вас.

Также я вижу, что мы используем одни и те же зависимости. В моем случае мне пришлось вручную удалить hamcrest.jar и objenesis.jar, так как были конфликты.

Надеюсь, это поможет.

Другие вопросы по тегам