如何在Android项目中使用PowerMock?

Mat*_*ley 13 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我尝试从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问题吗?

pob*_*key 11

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

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

  • @lowellk有一个解决方法.有一个非静态方法调用静态方法,然后将其存根.例如,如果`HttpConstants.getUrl()`是静态方法,则编写另一个方法:`String getUrl(){return HttpConstants.getUrl(); 然后,你可以将该方法存根. (7认同)

All*_*ing 10

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

在我的模块的gradle设置中,我想测试我的代码

// Mockito and PowerMock
androidTestCompile ('org.powermock:powermock-mockito-release-full:1.6.0') {
    exclude module: 'hamcrest-core'
    exclude module: 'objenesis'
}
Run Code Online (Sandbox Code Playgroud)

一切都运行良好.只要我使用:

@RunWith(PowerMockRunner.class) @PrepareForTest(ClassToMock.class)
Run Code Online (Sandbox Code Playgroud)

注释我的课程(例如,不能用Robolectric运行它,在CI环境中仍然可以)