test mock method example android unit-testing junit mockito powermock

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