2015-01-14 15 views
7

sto cercando di incorporare Powermock come una dipendenza per i miei test Android utilizzando la seguente configurazione build.gradle:Come arrivare Powermock lavorare con 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' 
    } 
} 

Tuttavia, il compilatore si lamenta che

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 

Esaminando la struttura barattolo, ho notato che sia Dexmaker e Powermock dichiarare un MockMaker in mockito-extensions

img

Che cos'è un MockMaker? Come si differenziano? E la domanda più importante: è possibile far funzionare correttamente Powermock con Dexmaker?

Grazie in anticipo. Qualsiasi aiuto sarebbe molto apprezzato.

risposta

9

MockMaker è un modulo di colla che integra il dexmaker con Mockito. Fa ciò che è necessario per Mockito per generare classi concrete con i file .dex di Dalvik invece dei file .class di JVM.

È possibile che Powermock funzioni con Dexmaker, ma è improbabile che le funzionalità avanzate di Powermock funzionino. In particolare, Powermock advertises this:

PowerMock utilizza un programma di caricamento classe personalizzata e la manipolazione bytecode per consentire beffardo di metodi statici, costruttori, classi e metodi finali, i metodi privati, la rimozione di inizializzatori statici e molto altro ancora.

Che classe personalizzata caricatore è improbabile che funzioni su dalvikvm.

1

Ho avuto lo stesso problema e ho appena trovato la soluzione here. Implica un po 'di lavoro manuale e dovrai modificare tu stesso il file jar.

Quindi, ciò che suggerisce nparihar è il seguente.

  1. Fai la copia di backup del powermock-api-Mockito-1.5.5.jar
  2. Rename powermock-api-Mockito-1.5.5.jar a powermock-api-mockito-1.5.5.zip
  3. Unzip powermock-api-mockito-1.5.5.zip
  4. cd powermock-api-Mockito-1.5.5/
  5. rm -rf Mockito-estensioni
  6. jar cf powermock-api-Mockito-1.5.5 .jar META-INF/org/
  7. metti il ​​nuovo barattolo nel tuo poper di libs.

Questa soluzione ha funzionato per me. Fammi sapere se funziona anche per te.

Inoltre, posso vedere che stiamo usando le stesse dipendenze. Nel mio caso ho dovuto rimuovere manualmente il hamcrest.jar e il objenesis.jar come c'erano confilcts.

Spero che questo aiuti.

+0

stai suggerendo Dalvik quindi permetterà l'utilizzo di questa funzionalità ed è possibile sovrascrivere i metodi finali, per esempio? –

3

si può provare a mettere questo nel vostro build.gradle, ha risolto a me lo stesso problema

android{ 
... 

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

... 

}