惩戒方法调用使用电力的Mockito - org.powermock.api.mockito.ClassNotPreparedException

问题描述 投票:19回答:2

我有一个图像加载器类,而我需要它来测试一些静态方法。由于它的Mockito不支持静态方法我切换到电源的Mockito。但静态方法我测试有一个方法调用

 Base64.encodeToString(byteArray, Base64.DEFAULT);

嘲笑这个我使用如下mockStatic法@PrepareForTest注解。

 PowerMockito.mockStatic(Base64.class);

但是Android工作室返回我还是回到我的错误如下。

org.powermock.api.mockito.ClassNotPreparedException:类android.util.Base64不是为了准备考试。为了准备这个类,添加类的“@PrepareForTest”注释。

下面是我完整的代码。

代码进行测试:

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Base64;
import android.widget.ImageView;

  public static String convertBitmapToBase64(Bitmap imageBitmap, boolean withCompression) {
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    imageBitmap.compress(Bitmap.CompressFormat.PNG, 120, byteArrayOutputStream);
    byte[] byteArray = byteArrayOutputStream.toByteArray();
    return Base64.encodeToString(byteArray, Base64.DEFAULT);
}

测试类代码

import android.graphics.Bitmap;
import android.util.Base64;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.testng.annotations.Test;

@RunWith(PowerMockRunner.class)
@PrepareForTest({Base64.class})
public class ImageLoaderTest  {
@Test
   public void testConvertBitmap(){
    byte[] array = new byte[20];
    PowerMockito.mockStatic(Base64.class);
    PowerMockito.when(Base64.encodeToString(array, Base64.DEFAULT)).thenReturn("asdfghjkl");
    Bitmap mockedBitmap= PowerMockito.mock(Bitmap.class);
    String output = ImageLoaderUtils.convertBitmapToBase64(mockedBitmap);
    assert (!output.isEmpty());
}

}

摇篮依赖

testCompile 'junit:junit:4.12'
testCompile 'org.powermock:powermock:1.6.5'
testCompile 'org.powermock:powermock-module-junit4:1.6.5'
testCompile 'org.powermock:powermock-api-mockito:1.6.5'
android unit-testing junit mockito powermock
2个回答
11
投票

简短的回答,你不能。这里从FAQ

什么是中的Mockito的局限性

  • 不能嘲笑final类
  • 不能嘲笑静态方法
  • 不能嘲笑最后的方法 - 他们真正的行为是没有任何异常执行。可以的Mockito没有警告你嘲讽最终方法,所以要提高警惕。

有关此限制的更多信息:

我可以模拟静态方法?

编号喜欢的Mockito面向对象和依赖注入的对静,程序代码是很难理解和变化。如果你对付可怕的遗留代码,您可以使用JMockit或Powermock嘲笑静态方法。

如果你想使用PowerMock尝试这样的:

@RunWith(PowerMockRunner.class)
@PrepareForTest( { Base64.class })
public class YourTestCase {
    @Test
    public void testStatic() {
        mockStatic(Base64.class);
        when(Base64.encodeToString(argument)).thenReturn("expected result");
    }
}

编辑:在Mockito 2 it's now possible to mock final Class and final Method。这是一个选择的选项。您需要创建一个包含以下内容的文件src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker

mock-maker-inline

0
投票

除了@PrepareForTest还使用extends PowerMockTestCase

例如: @PrepareForTest({Base64.class}) public class ImageLoaderTest extends PowerMockTestCase

© www.soinside.com 2019 - 2024. All rights reserved.