Cómo burlar MotionEvent y SensorEvent para la prueba de unidad en android?

¿Cómo probar las SensorEvent android SensorEvent y MotionEvent ?

Necesito crear un objeto MotionEvent para las pruebas de Unidad. (Tenemos el método de obtain de MotionEvent que podemos usar después de burlarse para crear un objeto personalizado MotionEvent )

Para la clase MotionEvent, he intentado con Mockito como:

 MotionEvent Motionevent = Mockito.mock(MotionEvent.class); 

Pero después de error que estoy recibiendo en Android Studio:

 java.lang.RuntimeException: Method obtain in android.view.MotionEvent not mocked. See https://sites.google.com/a/android.com/tools/tech-docs/unit-testing-support for details. at android.view.MotionEvent.obtain(MotionEvent.java) 

Siguiendo el sitio mencionado en este error, he agregado

 testOptions { unitTests.returnDefaultValues = true } 

En build.gradle, pero todavía estoy recibiendo este mismo error. ¿Alguna idea sobre esto?

Finalmente lo implementé para MotionEvent usando Roboelectric

 import android.view.MotionEvent; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.annotation.Config; import static org.junit.Assert.assertTrue; import org.robolectric.RobolectricGradleTestRunner; @RunWith(RobolectricGradleTestRunner.class) @Config(constants = BuildConfig.class) public class ApplicationTest { private MotionEvent touchEvent; @Before public void setUp() throws Exception { touchEvent = MotionEvent.obtain(200, 300, MotionEvent.ACTION_MOVE, 15.0f, 10.0f, 0); } @Test public void testTouch() { assertTrue(15 == touchEvent.getX()); } } 

¿Cómo podemos hacer lo mismo para SensorEvents ?

He aquí cómo podría simular un SensorEvent para un evento de acelerómetro:

 private SensorEvent getAccelerometerEventWithValues( float[] desiredValues) throws Exception { // Create the SensorEvent to eventually return. SensorEvent sensorEvent = Mockito.mock(SensorEvent.class); // Get the 'sensor' field in order to set it. Field sensorField = SensorEvent.class.getField("sensor"); sensorField.setAccessible(true); // Create the value we want for the 'sensor' field. Sensor sensor = Mockito.mock(Sensor.class); when(sensor.getType()).thenReturn(Sensor.TYPE_ACCELEROMETER); // Set the 'sensor' field. sensorField.set(sensorEvent, sensor); // Get the 'values' field in order to set it. Field valuesField = SensorEvent.class.getField("values"); valuesField.setAccessible(true); // Create the values we want to return for the 'values' field. valuesField.set(sensorEvent, desiredValues); return sensorEvent; } 

Cambie el tipo o los valores según corresponda a su caso de uso.

  • Mockito: ¿Cómo uso getString con mockito?
  • No se puede burlar la clase final de Kotlin usando Mockito 2
  • PowerMock en el proyecto Android
  • Cómo espiar correctamente una actividad
  • Mockito - ¿Qué hace el método de verificación?
  • Intento de trozo de clase de actividad de Android con PowerMockito lanza RuntimeException "Stub!"
  • Intentando burlarse de Environment.getExternalStorageState
  • Utilizar mockito para probar la función que utiliza un contexto
  • Llamar a un método de la actividad probada de una prueba usando espresso y ver sus resultados
  • No puede encontrar ProxyFrameworkImpl por nombre
  • Cómo probar métodos de unidad que interactúan con clases de sistema (o Android)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.