Wie zu verwenden PowerMock in Android-Projekten?
Erstellte ich ein neues Android-Projekt testen. Ich heruntergeladen powermock-mockito-junit-1-1.5.zip von https://code.google.com/p/powermock/downloads/list. Ich fügte hinzu, alle Bibliotheken in das test-Projekt ist libs
Ordner. Die test-Klasse ist ein sehr einfaches Objekt:
package com.test.test;
import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner;
import android.util.Log;
@RunWith(PowerMockRunner.class)
public class TestTestAndroid {
public void testRuns() {
Log.e("test", "Test case is called");
}
}
Dann, ich versuche läuft das Projekt aus Eclipse oder das Projekt von der Befehlszeile aus. Ich bekomme den gleichen Fehler:
Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lorg/hamcrest/Description;
Als es stellt sich heraus, dass beide junit-4.8.2.jar
und mockito-all-1.9.5.jar
definieren org.hamcrest.Description
. Ich muss die Mockito-Glas aus offensichtlichen Gründen - ich brauche Mockito. Eine andere version von JUnit wird von Android, aber es ist eine alte version, die nicht die @RunWith
annotation.
Kann mir jemand beantworten, wie zu verwenden powermock und mockito in einem Android-Projekt, ohne die widersprüchlichen org.hamcrest.Description
problem?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sorry, Sie können nicht verwenden, PowerMock, die in der Dalvik-VM.
PowerMock funktioniert, indem Sie mit dem test unter einem benutzerdefinierten ClassLoader verwendet Javassist zu ändern, den bytecode von Klassen. Dies funktioniert in Ordnung, auf einer normalen JVM, aber auf Dalvik den bytecode und Klasse format Verschieden sind, so dass dieser Ansatz nicht funktioniert. PowerMock werden müssten neu geschrieben, um Dexmaker anstelle von Javassist - wäre dies ausgesprochen nicht-trivial, und ich sehe nicht ein, so etwas auf die PowerMock Themen-Liste.
HttpConstants.getUrl()
ist eine statische Methode, schreiben Sie eine weitere Methode:String getUrl() { return HttpConstants.getUrl(); }
Dann können Sie die stub-Methode aus.Finde ich eigentlich, dass dies völlig unwahr ist (zumindest mit der neuesten version).
In meinem gradle-setup für das Modul, wo ich testen will, meinen code habe ich
und alles läuft wunderbar. Solange ich:
kommentieren meiner Klasse (zB nicht ausführen können, es mit Robolectric, noch gut in CI-Umgebungen)
import org.powermock.modules.junit4.PowerMockRunner;
stellen Sie nur sicher, wenn Sie mit androidTestCompile, die instrumentation-tests mit diesem import sind in der androidTest Ordner, etcgradle -q app:dependencies
an der Wurzel Ihres Projektes in der Befehlszeile, um zu sehen, was Importe sind, überlappen. Beachten Sie auch, dass diepowermock-mockito-release-full
import enthält Mockito, so brauchen Sie nicht zu importieren.