У меня есть класс загрузчика изображений, и мне нужно проверить некоторые статические методы в нем. Поскольку Mockito не поддерживает статические методы, я переключился на Power Mockito. Но статический метод, который я тестирую, имеет вызов метода
Base64.encodeToString(byteArray, Base64.DEFAULT);
Чтобы издеваться над этим, я использую метод mockStatic, как показано ниже, с аннотацией @PrepareForTest.
PowerMockito.mockStatic(Base64.class);
Но Android-студия возвращает мне все еще возвращающую мне ошибку, как показано ниже.
Org.powermock.api.mockito.ClassNotPreparedException: класс android.util.Base64 не подготовлен к тестированию. Чтобы подготовить этот класс, добавьте класс в аннотацию @PrepareForTest.
- Попытка заглушить андроид Класс активности с использованием PowerMockito throws RuntimeException «Stub!»
- Как использовать Active Android с базой данных в памяти для модульных тестов с использованием Robolectric?
- AndroidManifest в директории androidTest игнорируется
- Akquinet (Android с тестовым архетипом) - юнит-тесты не выполняются
- Тестирование узла с помощью RxJava CompositeSubscription
Ниже мой полный код.
Код для тестирования:
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'
Короткий ответ вы не можете. Здесь из 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})
(обратите внимание на скользящие фигурные скобки в вашем коде). Учитывая ошибку, которую вы получаете, я думаю, что это важно.