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")

  • No se puede burlar la clase final de Kotlin usando Mockito 2
  • Robolectric Unit Test falla con las actualizaciones de Android Studio 2.3
  • Robolectric y Android Studio 1.1.0 y pruebas de biblioteca
  • ActivityUnitTestCase y startActivity
  • Cómo determinar la unidad de píxeles (px, dp, etc) de una vista en Java?
  • Configuración de la prueba de unidad para varios módulos
  • Cómo probar una actividad usando google-api-client
  • Cómo generar informes de pruebas de Android en HTML automáticamente
  • Android Studio Gradle androidTest vs instrumentTest
  • Pruebas Robolectric que se ejecutan en Android Studio pero no en la línea de comandos
  • Crear proyecto de prueba de android en intellij idea 13 community edition
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.