如何在Android项目中使用PowerMock?

时间:2013-03-09 00:06:15

标签: android mocking mockito powermock

我创建了一个新的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罐子 - 我需要Mockito。 Android提供了不同版本的JUnit,但它是旧版本,不包含@RunWith注释。

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

2 个答案:

答案 0 :(得分:11)

抱歉,您无法在Dalvik VM中使用PowerMock。

PowerMock的工作原理是在自定义ClassLoader下运行测试,使用Javassist修改类的字节码。这在普通的JVM上运行正常,但在Dalvik上字节码和类格式不同,所以这种方法不起作用。需要重写PowerMock才能使用Dexmaker而不是Javassist - 这绝对是非常重要的,我在PowerMock issues list上看不到这样的内容。

答案 1 :(得分:10)

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

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