Подтвердить что ты не робот

Как использовать PowerMock в проектах Android?

Я создал новый тестовый проект для Android. Я загрузил powermock-mockito-junit-1-1.5.zip из https://code.google.com/p/powermock/downloads/list. Я добавил все библиотеки в тестовый проект libs. Класс test - очень простой объект:

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. Я должен включить банку Mockito по очевидным причинам - мне нужен Мокито. Другая версия JUnit предоставляется Android, но это старая версия, которая не включает аннотацию @RunWith.

Может ли кто-нибудь ответить, как использовать powermock и mockito в Android-проекте, без конфликтной проблемы org.hamcrest.Description?

4b9b3361

Ответ 1

Извините, вы не можете использовать PowerMock в VM Dalvik.

PowerMock работает, запуская ваш тест под специальным ClassLoader, который использует Javassist, чтобы изменить байт-код ваших классов. Это нормально работает на обычной JVM, но на Dalvik формат байт-кода и класса отличается, поэтому этот подход не работает. PowerMock необходимо переписать для использования Dexmaker вместо Javassist - это было бы явно нетривиально, и я не вижу ничего подобного это в списке проблем PowerMock .

Ответ 2

Собственно, я считаю, что это совершенно неверно (по крайней мере, с последней версией).

В моей настройке 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)