Cómo probar la unidad android y burlarse de un método estático

Hola, realmente espero que puedas ayudarme, siento que he estado tirando de mi pelo por días.

Estoy tratando de escribir pruebas de unidad para un método A. El método A llama a un método estático B. Quiero burlar el método estático B.

Sé que esto se ha preguntado antes, pero siento Android ha madurado desde entonces, y debe haber una manera de hacer una tarea tan simple sin volver a escribir los métodos que quiero probar.

Aquí hay un ejemplo, primero el método que quiero probar:

public String getUserName(Context context, HelperUtils helper) { if(helper == null){ helper = new HelperUtils(); } int currentUserId = helper.fetchUsernameFromInternet(context); if (currentUserId == 1) { return "Bob"; } else { return "Unknown"; } } 

A continuación, el método estático que quiero simular:

 public class HelperUtils { public static int fetchUsernameFromInternet(Context context) { int userid = 0; Log.i("HelperUtils ", "hello"); return userid; } } 

En otros idiomas esto es tan fácil, pero no puedo hacer que funcione en Android. He intentado Mockito, pero parece que los métodos estáticos no son compatibles

 HelperUtils helper = Mockito.mock(HelperUtils.class); Mockito.when(helper.fetchUsernameFromInternet(getContext())).thenReturn(1); 

Estos errores

Org.mockito.exceptions.misusing.MissingMethodInvocationException

He intentado Powermock, pero no estoy completamente seguro de que esto es compatible con Android. Me las arreglé para conseguir powermock corriendo usando androidCompile en mi archivo gradle pero consigo este error:

Error: Error de ejecución para la tarea ': app: dexDebugAndroidTest'. Com.android.ide.common.process.ProcessException:

Sin mencionar PowerMockito.mockStatic(HelperUtils.class); No devuelve nada, así que no sé qué pasar en mi método getUsername!

Cualquier ayuda sería muy apreciada.

One Solution collect form web for “Cómo probar la unidad android y burlarse de un método estático”

Los métodos estáticos no están relacionados con ningún objeto – tu helper.fetchUsernameFromInternet(...) es el mismo (pero un poco confuso) como HelperUtils.fetchUsernameFromInternet(...) – incluso deberías obtener una advertencia del compilador debido a este helper.fetchUsernameFromInternet .

Lo que es más, en lugar de Mockito.mock para burlar los métodos estáticos que tiene que usar: @RunWith(...) , @PrepareForTest(...) y luego PowerMockito.mockStatic(...) – ejemplo completo está aquí: PowerMockito mock Único método estático y objeto de retorno

En otras palabras – burlarse de los métodos estáticos (y también los constructores) es un poco difícil. Mejor solución es:

  • Si puedes cambiar HelperUtils , haz que el método no sea estático y ahora puedes burlar HelperUtils con el habitual Mockito.mock

  • Si no puede cambiar HelperUtils , cree una clase de contenedor que delegue a HelperUtils original, pero no tenga métodos static y, a continuación, también use Mockito.mock habitual (esta idea se denomina a veces " pueblo")

  • Adaptador RecyclerView en la prueba de unidad
  • Cómo ejecutar todas las pruebas (unitarias e instrumentadas) con un solo clic en Android Studio
  • ¿Por qué obtengo un error de acceso ilegal al ejecutar las pruebas de Android?
  • Prueba de unidad en la función de extensión de Kotlin en las clases de SDK de Android
  • El uso de InstrumentationTestRunner personalizado en Eclipse provoca un error
  • Prueba de unidad Android SMS Receiver
  • ¿Por qué realizar pruebas en un proyecto separado, en lugar de carpeta?
  • ActivityInstrumentationTestCase2 vs ActivityTestRule
  • Creación de un simulador de AlarmManager para la prueba
  • IllegalStateException en Android Support al ejecutar pruebas de unidad
  • Cómo ensayar un servicio de Android que depende de una conexión de red
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.