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
)
- Robolectric Test no llama a textWatcher.onTextChanged
- ¿Cómo burlar el método antes de que se cree la actividad?
- VerifyError con Mockito 1.9.5 y DexMaker-Mockito-1.0
- Prueba de una clase Fragment en aislamiento usando Mockito
- MockitoAnnotations.initMocks se bloquea mientras que mock () tiene éxito
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?
- Android molesta una Dagger2 inyecta dependencia para una prueba de Espresso
- Los simulacros de Mockito ejecutan el código actual de Android en Lollipop o superior
- Mockito en el emulador de Android
- Mockito - burlándose de una interfaz - lanzando NullPointerException
- Cómo resolver java.lang.AssertionError al crear OkHttpClient en mockito?
- TDD en Android con Robolectric y Mockito
- Compruebe que el método se llama en onNext del suscriptor de RxJava
- Siempre obtener el error de hilo incluso si la prueba de unidad pasa en Android usando Mockito
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.