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,
- Método de ContentValues no se burla
- Robolectric Test no llama a textWatcher.onTextChanged
- Mockito / Power Mockito: incapaz de obtener la salida esperada cuando el método de burla de LayoutParams en android
- ¿Qué significa 'SRPy' en la documentación de Mockito
- ¿Cómo depurar las pruebas de instrumentación en Android Studio?
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…
- TDD en Android con Robolectric y Mockito
- Cómo probar la unidad android y burlarse de un método estático
- IllegalArgumentException con Mockito
- Prueba de unidad Retrofit api call con Mockito - ArgumentCaptor
- Unidad de prueba de la aplicación android con retrofit y rxjava
- Java.lang.AbstractMethodError cuando espía la LinkedList en Android
- Cómo burlar Contexto usando Mockito?
- ¿Por qué ArgumentCaptor no coincide correctamente?
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:
-
android.jar
se mofa antes, por lo que algunos API de Android valor de retorno puede no ser como se esperaba. - 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 } }
- Error al crear un proyecto en un nuevo espacio de trabajo
- Cómo convertir `content: // media / external / images / media / Y` a` file: /// storage / sdcard0 / Pictures / X.jpg` en android?