15

我创建了一个新的 Android 测试项目。我从https://code.google.com/p/powermock/downloads/list下载了 powermock-mockito-junit-1-1.5.zip 。我将所有库添加到测试项目的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.jarmockito-all-1.9.5.jar定义org.hamcrest.Description. 出于显而易见的原因,我必须包含 Mockito jar - 我需要 Mockito。Android 提供了不同版本的 JUnit,但它是不包含@RunWith注解的旧版本。

有人可以回答如何在 Android 项目中使用 powermock 和 mockito,而不会出现冲突的org.hamcrest.Description问题吗?

4

2 回答 2

13

抱歉,你不能在 Dalvik VM 中使用 PowerMock。

PowerMock 通过在使用Javassist修改类的字节码的自定义 ClassLoader 下运行测试来工作。这在普通 JVM 上可以正常工作,但在 Dalvik 上,字节码和类格式不同,所以这种方法不起作用。需要重写 PowerMock 以使用Dexmaker而不是 Javassist - 这绝对不是微不足道的,而且我在 PowerMock问题列表中看不到任何类似的东西。

于 2013-11-01T23:54:40.250 回答
12

实际上,我发现这完全不真实(至少在最新版本中)。

在我想要测试我的代码的模块的 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 环境中仍然可以)

于 2014-12-05T05:54:44.567 回答