Вызывание методов вызова с использованием power mockito – org.powermock.api.mockito.ClassNotPreparedException

У меня есть класс загрузчика изображений, и мне нужно проверить некоторые статические методы в нем. Поскольку Mockito не поддерживает статические методы, я переключился на Power 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' 

Solutions Collecting From Web of "Вызывание методов вызова с использованием power mockito – org.powermock.api.mockito.ClassNotPreparedException"

Короткий ответ вы не можете. Здесь из FAQ :

Каковы ограничения 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"); } } 

Подробнее о тестовом образце

На самом деле тривиально, я думаю, что вы неправильно вызываете prepareForTest . Он должен быть prepareForTest(Base64.class) не prepareForTest({Base64.class}) (обратите внимание на скользящие фигурные скобки в вашем коде). Учитывая ошибку, которую вы получаете, я думаю, что это важно.