Necesita ayuda para escribir una prueba de unidad usando Mockito y JUnit4

Necesita ayuda para escribir una prueba de unidad para el siguiente código usando Mockito y JUnit4,

public class MyFragmentPresenterImpl { public Boolean isValid(String value) { return !(TextUtils.isEmpty(value)); } }` I tried below method, MyFragmentPresenter mMyFragmentPresenter @Before public void setup(){ mMyFragmentPresenter=new MyFragmentPresenterImpl(); } @Test public void testEmptyValue() throws Exception { String value=null; assertFalse(mMyFragmentPresenter.isValid(value)); } 

Pero devuelve la siguiente excepción,

Java.lang.RuntimeException: El método isEmpty en android.text.TextUtils no es burlado. Consulte http://g.co/androidstudio/not-mocked para obtener más detalles. En android.text.TextUtils.isEmpty (TextUtils.java) at ….

Gracias por adelantado…

Debido a la clase JUnit TestCase no puede utilizar Android relacionadas con las API, tenemos que Mock it.
Utilice PowerMockito para PowerMockito la clase estática.

Agregue dos líneas sobre su clase de caso de prueba,

 @RunWith(PowerMockRunner.class) @PrepareForTest(TextUtils.class) public class YourTest { } 

Y el código de configuración

 @Before public void setup() { PowerMockito.mockStatic(TextUtils.class); PowerMockito.when(TextUtils.isEmpty(any(CharSequence.class))).thenAnswer(new Answer<Boolean>() { @Override public Boolean answer(InvocationOnMock invocation) throws Throwable { CharSequence a = (CharSequence) invocation.getArguments()[0]; return !(a != null && a.length() > 0); } }); } 

Que implementan TextUtils.isEmpty() con nuestra propia lógica.

Además, agregue dependencias en archivos app.gradle .

 testCompile "org.powermock:powermock-module-junit4:1.6.2" testCompile "org.powermock:powermock-module-junit4-rule:1.6.2" testCompile "org.powermock:powermock-api-mockito:1.6.2" testCompile "org.powermock:powermock-classloading-xstream:1.6.2" 

Gracias a la Behelit de Behelit y Exception .

Utilice PowerMockito

Agregue esto por encima de su nombre de clase e incluya cualquier otro nombre de clase CUT (clases bajo prueba)

 @RunWith(PowerMockRunner.class) @PrepareForTest({TextUtils.class}) public class ContactUtilsTest { 

Añada esto a su @Before

 @Before public void setup(){ PowerMockito.mockStatic(TextUtils.class); mMyFragmentPresenter=new MyFragmentPresenterImpl(); } 

Esto hará que los valores por defecto de PowerMockito para los métodos dentro de TextUtils

También tendrías que añadir las depedencias relevantes de gradle

 testCompile "org.powermock:powermock-module-junit4:1.6.2" testCompile "org.powermock:powermock-module-junit4-rule:1.6.2" testCompile "org.powermock:powermock-api-mockito:1.6.2" testCompile "org.powermock:powermock-classloading-xstream:1.6.2" 

Se trata de un problema conocido como se ha mencionado por @Exception. En mi caso, también tropecé con la misma situación, pero en consejo de los mayores deci decidió utilizar Strings.isNullOrEmpty() lugar de TextUtils.isEmpty() . Resultó ser una buena manera de evitarlo.

Actualización: Debo mencionar que esta función de utilidad Strings.isNullOrEmpty() requiere la biblioteca de guayaba.

Este es un problema conocido, debido a una cláusula en la Prueba Fundamental de Android que dice:

Puede utilizar la clase JUnit TestCase para realizar pruebas de unidad en una clase que no llame a APIs de Android.

El comportamiento predeterminado es problemático cuando se utilizan clases como Log o TextUtils .

Para resumir:

  1. android.jar se mofa antes, por lo que algunos API de Android valor de retorno puede no ser como se esperaba.
  2. JUnit en sí es una sola medida para el código java, así que trate de no usar los métodos de la API de Android.

Fuente: http://www.liangfeizc.com/2016/01/28/unit-test-on-android/

Fui capaz de solucionar este error ejecutando la clase de prueba con lo siguiente.

@RunWith (RobolectricGradleTestRunner.class) public class MySimpleTest {….. un montón de casos de prueba}

Esta página wiki explica con mayor detalle https://github.com/yahoo/squidb/wiki/Unit-testing-with-model-objects

Agregue esta línea en su archivo gradle en caso de Android Studio.

 android{ .... testOptions { unitTests.returnDefaultValues = true } } 
  • Mockito - burlándose de una interfaz - lanzando NullPointerException
  • Mockito + Dexmaker en Android
  • ¿Cómo puedo obtener Mockito trabajando en androidTest
  • Cómo crear un objeto retrofit.Response durante las pruebas de unidad con Retrofit 2
  • Llamar a un método de la actividad probada de una prueba usando espresso y ver sus resultados
  • Prueba de unidad JVM con Mockito para pruebas Retrofit2 y RxJava para solicitudes de red
  • SecurityProvider en Mockito Pruebas cuando se ejecuta junto a Robolectric
  • Prueba de Mockito + Dexmaker se bloquea cuando se ejecuta en Android <4.4
  • ¿Cómo usar PowerMock en proyectos de Android?
  • Prueba de unidad de Android con Retrofit / RxJava / Roboletric y Mockito
  • Cómo resolver java.lang.AssertionError al crear OkHttpClient en mockito?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.