我创建了一个新的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.jar
和mockito-all-1.9.5.jar
都定义了org.hamcrest.Description
。出于显而易见的原因,我必须包括Mockito罐子 - 我需要Mockito。 Android提供了不同版本的JUnit,但它是旧版本,不包含@RunWith
注释。
有人可以回答如何在Android项目中使用powermock和mockito,而不会出现有冲突的org.hamcrest.Description
问题吗?
答案 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环境中仍然可以正常运行)