Как использовать PowerMock в проектах Android?
Я создал новый тестовый проект Android. Я загрузил powermock-mockito-junit-1-1.5.zip от https://code.google.com/p/powermock/downloads/list. Я добавил все библиотеки в тестовый проект libs
папка. Тестовый класс представляет собой очень простой объект:
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");
}
}
затем я пытаюсь запустить проект из Eclipse или сделать проект из командной строки. Я получаю ту же ошибку:
Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lorg/hamcrest/Description;
как оказалось, как junit-4.8.2.jar
и mockito-all-1.9.5.jar
определение org.hamcrest.Description
. Я должен включить банку Мокито по очевидным причинам - мне нужен Мокито. Другая версия JUnit предоставляется Android, но это старая версия, которая не включает в себя @RunWith
Примечание.
может ли кто-нибудь ответить, как использовать powermock и mockito в проекте Android, без конфликта org.hamcrest.Description
проблема?
2 ответов
Извините, вы не можете использовать PowerMock в виртуальной машине Dalvik.
PowerMock работает, запустив тест под пользовательским загрузчиком классов, который использует Javassist модифицировать байт-код ваших классов. Это хорошо работает на обычной JVM, но на Dalvik байт-код и формат класса отличаются, поэтому этот подход не работает. PowerMock нужно будет переписать, чтобы использовать Dexmaker вместо Javassist-это было бы решительно нетривиально, и я ничего не вижу вот так на PowerMock вопросы.
На самом деле, я считаю, что это совершенно неверно (по крайней мере, с последней версией).
в моей настройке gradle для модуля, где я хочу проверить свой код, у меня есть
// Mockito and PowerMock
androidTestCompile ('org.powermock:powermock-mockito-release-full:1.6.0') {
exclude module: 'hamcrest-core'
exclude module: 'objenesis'
}
и все работает нормально. Пока я использую:
@RunWith(PowerMockRunner.class) @PrepareForTest(ClassToMock.class)
чтобы аннотировать мой класс (например, не могу запустить его с Robolectric, все еще отлично в средах CI)