2015-01-14 5 views
7

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

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?

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

ответ

9

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

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

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

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

1

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

Итак, что предлагает nparihar.

  1. сделать резервную копию powermock-Апи-Mockito-1.5.5.jar
  2. Rename powermock-апи-Mockito-1.5.5.jar к powermock-api-mockito-1.5.5.zip
  3. UnZip powermock-api-mockito-1.5.5.zip
  4. кд powermock-апи-Mockito-1.5.5/
  5. гт -rf Mockito-расширения
  6. баночка сравни powermock-апи-Mockito-1.5.5 .jar META-INF/org/
  7. положить новую банку в свою папку libs.

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

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

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

+0

вы предлагаете Dalvik тогда разрешить использование этой функции, и это можно переопределить окончательные методы для пример? –

3

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

android{ 
... 

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

... 

} 
Смежные вопросы