android - method - mockito wiki
Simulación de llamadas a métodos usando power mockito-org.powermock.api.mockito.ClassNotPreparedException (2)
Además del uso de @PrepareForTest
también se extends PowerMockTestCase
Ejemplo: @PrepareForTest({Base64.class}) public class ImageLoaderTest extends PowerMockTestCase
Tengo una clase de cargador de imágenes y necesito probar algunos métodos estáticos. Como Mockito no admite métodos estáticos, cambié a Power Mockito. Pero el método estático que estoy probando tiene un método llamado
Base64.encodeToString(byteArray, Base64.DEFAULT);
Para simular esto, estoy usando el método mockStatic como se muestra a continuación con la anotación @PrepareForTest.
PowerMockito.mockStatic(Base64.class);
Pero el estudio de Android me está devolviendo y me sigue devolviendo un error como se muestra a continuación.
org.powermock.api.mockito.ClassNotPreparedException: La clase android.util.Base64 no está preparada para la prueba. Para preparar esta clase, agregue la clase a la anotación ''@PrepareForTest''.
A continuación se muestra mi código completo.
Código a probar:
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);
}
Código de clase de prueba
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());
}
}
Dependencias 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''
Respuesta corta que no puedes. Aquí de la FAQ :
¿Cuáles son las limitaciones de Mockito?
- No se puede burlar de las clases finales
- No se puede burlar de los métodos estáticos
- No se puede burlar de los métodos finales: su comportamiento real se ejecuta sin excepción. Mockito no puede advertirte sobre los métodos finales burlones, así que mantente alerta.
Más información sobre esta limitación:
¿Puedo simular métodos estáticos?
No. Mockito prefiere la orientación a objetos y la inyección de dependencia sobre el código de procedimiento estático, que es difícil de entender y cambiar. Si tratas con un código heredado de miedo, puedes usar JMockit o Powermock para simular métodos estáticos.
Si quieres usar PowerMock, prueba esto:
@RunWith(PowerMockRunner.class)
@PrepareForTest( { Base64.class })
public class YourTestCase {
@Test
public void testStatic() {
mockStatic(Base64.class);
when(Base64.encodeToString(argument)).thenReturn("expected result");
}
}
EDITAR: En Mockito 2 ahora es posible simular la clase final y el método final . Es una opción opt-in. src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
crear el archivo src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
con el siguiente contenido:
mock-maker-inline