Как заставить 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
Что такое 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 предлагает следующее.
- Сделайте резервную копию powermock-api-mockito-1.5.5.jar
- Переименуйте powermock-api-mockito-1.5.5.jar в powermock-api-mockito-1.5.5.zip
- Разархивируйте powermock-api-mockito-1.5.5.zip
- cd powermock-api-mockito-1.5.5 /
- rm -rf mockito-extensions
- jar cf powermock-api-mockito-1.5.5.jar META-INF / org /
- поставь новую баночку в свои любимые.
Это решение сработало для меня. Дайте мне знать, если это работает и для вас.
Также я вижу, что мы используем одни и те же зависимости. В моем случае мне пришлось вручную удалить hamcrest.jar и objenesis.jar, так как были конфликты.
Надеюсь, это поможет.