Cómo llamar a Button.performClick en Android JUnit test case?
Soy nuevo en las pruebas de Android. Me gustaría probar si al hacer clic en un botón se abrirá una actividad correspondiente o no. Hice algunas investigaciones y descubrí que tendré que usar ActivityManager para hacer la comprobación.
El problema es que no puedo conseguir que funcione el "clic". Estoy intentando utilizar Button.performClick()
.
- Cómo burlar un objeto inyectado que no se declara en el módulo?
- Prueba de unidad Actividad.startService () llamada?
- ActivityInstrumentationTestCase2 vs ActivityTestRule
- Adaptador RecyclerView en la prueba de unidad
- Enredado con la prueba de Google
Inicialmente acabo de llamar a esta función, y recibí un error diciendo que no puedo hacer esto en el hilo actual. Después de algunos googling descubrí que tengo que llamar en el hilo de interfaz de usuario, y se encontró con el runOnUiThread(Runnable r) method
.
El botón al que intento hacer clic es _helloButton_
. Esto se obtiene en el _setUp()_ method
. Hice _assertNotNull_
comprobar en esto para asegurarse de que está allí.
Dentro de un método de prueba, llamo
mActivity.runOnUiThread(new Runnable() { public void run() { helloButton.requestFocus(); } }); helloButton.performClick();
Y obtengo un NPE en la línea llamando requestFocus()
.
Luego lo intenté
mActivity.runOnUiThread(new Runnable() { public void run() { helloButton.performClick(); } });
Y todavía obtener la misma excepción puntero nulo.
En la perspectiva de JUnit, recibo este mensaje
Test failed to run to completion. Reason: 'Instrumentation run failed due to 'java.lang.NullPointerException''. Check device logcat for details
Y el stackTrace tiene este aspecto.
08-05 19:03:11.922: ERROR/AndroidRuntime(578): Uncaught handler: thread main exiting due to uncaught exception 08-05 19:03:11.922: ERROR/AndroidRuntime(578): java.lang.NullPointerException 08-05 19:03:11.922: ERROR/AndroidRuntime(578): at com.example.helloworldmk2.test.HelloWorldMK2Test$1.run(HelloWorldMK2Test.java:57) 08-05 19:03:11.922: ERROR/AndroidRuntime(578): at android.os.Handler.handleCallback(Handler.java:587) 08-05 19:03:11.922: ERROR/AndroidRuntime(578): at android.os.Handler.dispatchMessage(Handler.java:92) 08-05 19:03:11.922: ERROR/AndroidRuntime(578): at android.os.Looper.loop(Looper.java:123) 08-05 19:03:11.922: ERROR/AndroidRuntime(578): at android.app.ActivityThread.main(ActivityThread.java:4363) 08-05 19:03:11.922: ERROR/AndroidRuntime(578): at java.lang.reflect.Method.invokeNative(Native Method) 08-05 19:03:11.922: ERROR/AndroidRuntime(578): at java.lang.reflect.Method.invoke(Method.java:521) 08-05 19:03:11.922: ERROR/AndroidRuntime(578): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 08-05 19:03:11.922: ERROR/AndroidRuntime(578): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 08-05 19:03:11.922: ERROR/AndroidRuntime(578): at dalvik.system.NativeStart.main(Native Method)
La línea 57 es donde llamo el helloButton.performClick()
.
No estoy seguro de por qué estoy recibiendo NPE; AssertNotNull pasa sin problema. Si me puede ayudar con este tema, realmente lo agradecería. Gracias por adelantado.
EDIT: Estoy subclase ActivityInstrumentationTestCase2 para esta clase de prueba en particular.
EDIT2: Logcat expulsa algunos errores antes de NPE sucede.
Ya veo
08-05 20: 08: 54.702: ERROR / AndroidRuntime (754): ERROR: conexión de subtítulos falló
y
08-05 20: 08: 58.642: ERROR / gralloc (52): [no registrar] manejar 0x3e1b28 todavía bloqueado (estado = 40000001)
- Cómo probar una actividad usando google-api-client
- Configuración de la prueba de unidad para varios módulos
- Apkbuilder encuentra el archivo duplicado al agregar powermock a un proyecto de prueba de android
- Cómo configurar gradle-2.2.1-all.zip manualmente
- Prueba de unidad de actividad
- ActivityUnitTestCase getActionBar () devuelve null
- Prueba de la unidad MVP de Android: ¿debo burlar el bus de eventos?
- Obtención de contexto en AndroidTestCase o InstrumentationTestCase en la función Prueba de unidad de Android Studio
Puede anotar la prueba para ejecutar en el subproceso de la interfaz de usuario:
@UiThreadTest public void testNoErrorInCapitalization() { final String msg = "this is a sample"; mMessage.setText(msg); mCapitalize.performClick(); final String actual = mMessage.getText().toString(); final String notExpectedRegexp = "(?i:ERROR)"; assertNotContainsRegex("Capitalization found error:", notExpectedRegexp, actual); }
Este es un ejemplo tomado de la Guía de pruebas de aplicaciones de Android .
También puede utilizar el método runTestOnUiThread () como a continuación
public void testHelloButton() throws Throwable{ runTestOnUiThread(new Runnable() { @Override public void run() { helloButton.performClick(); } }); }
Usted está tomando un enfoque demasiado difícil para un problema simple … esencialmente necesita código estructurado como este CUIDADO, esto es el código sudo y NO funcionará
public void myOnClickListener(View source) { switch source.getId() { case R.id.Your_Button_Name_In_Xml : Intent MyNewActivity = new Intent(this, MyNewClass.class); startActivity(MyNewActivity); } }
Mira esto http://learnandroid.blogspot.com/2008/01/opening-new-screen-in-android.html
- "Ya añadido" excepción con ormlite y gradle
- HttpURLConnection de Android y URL con caracteres especiales