2016-09-21 142 views
3

我有一个图像加载器类,我想测试一些静态方法。由于Mockito不支持静态方法,所以我切换到Power Mockito。然而我正在测试的静态方法有一个方法调用Power Mockito返回错误org.powermock.api.mockito.ClassNotPreparedException

Base64.encodeToString(byteArray, Base64.DEFAULT); 

嘲笑这我使用mockStatic方法如下。

PowerMockito.mockStatic(Base64.class); 

但Android工作室返回给我仍然返回错误如下。

org.powermock.api.mockito.ClassNotPreparedException:类 android.util.Base64不是测试制备。要准备此课程,请将 类添加到'@PrepareForTest'注释中。

以下是我的完整代码。

@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' 

回答

0

虽然我不知道肯定不,Android的工作室可以使用系统类加载器为Android课程,这就需要你use the same workarounds as for system classes

在幕后,Powermock使用一个特殊的类加载器来重写你准备的类,以这种方式Mockito或EasyMock可以存根/验证私有/静态/最终方法,而没有特殊的类加载Mockito和EasyMock通常依赖代理子类这将您限制为可见的可覆盖实例方法。但是,不可能覆盖由系统类加载器加载的类,因为官方实现已经被加载并且不能被替换或增强。 Powermock反而会准备/重写与系统类交互的类,因此可以拦截呼叫并将其重定向到您选择的模拟框架。另外,虽然它似乎只是一个术语问题,但是你说你想“测试一些静态方法”,而“Mockito不支持静态方法”。您可以在测试静态方法时使用Mockito,但不能像使用Base64.encodeToString一样使用Mockito来验证或存根(替代实现)静态方法;这就是你需要PowerMock的地方,就像你在这里做的那样。注意不要模拟被测试的系统,否则你可能会测试你的模拟行为,而不会真正测试任何真实的系统。