2016-09-21 13 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()); 
} 

}

Gradle зависимостей

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 обычно полагаются на подклассы proxy которые ограничивают видимые методы переопределяемых экземпляров. Тем не менее, невозможно перезаписать классы, загруженные системным загрузчиком классов, поскольку официальные реализации уже загружены и не могут быть заменены или дополнены. Вместо этого Powermock готовит/переписывает классы, которые взаимодействуют с системным классом, поэтому вызовы могут быть перехвачены и перенаправлены на выбранную вами насмешливую структуру.

Кроме того, хотя здесь, по-видимому, речь идет только о терминологии, вы говорите, что хотите «проверить некоторые статические методы» и что «Mockito не поддерживает статические методы». Вы можете использовать Mockito при тестировании статических методов, но вы не можете использовать Mockito для проверки или заглушения (замены реализации) статических методов, как и для Base64.encodeToString; вот где вам нужен PowerMock, как вы здесь. Будьте осторожны, чтобы никогда не издеваться над тестируемой системой, иначе вы можете протестировать свое издеваемое поведение, даже не проверяя реальную систему.

 Смежные вопросы

  • Нет связанных вопросов^_^