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() .

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)

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

  • Prueba de unidad de Android: ActivityMonitor waitForActivityWithTimeout devuelve NULL, getActivity nunca devuelve, error de permiso de INJECT_EVENTS
  • Prueba de clases sin actividad en Android
  • Diálogo de prueba en ActivityUnitTestCase de Android
  • Android Studio simple Unidad de prueba no funciona
  • Android compartió código generado entre test y androidTest
  • ¿Cómo compartir recursos entre la prueba de unidad y la prueba de instrumentación en android?
  • Crear proyecto de prueba de android en intellij idea 13 community edition
  • Las pruebas de Robolectric lanzan RuntimeException: java.lang.ClassNotFoundException
  • La falla de Android ActivityMonitor hace que getActivity () nunca vuelva
  • Robolectric y Android Studio 1.1.0 y pruebas de biblioteca
  • Android prueba: cómo comprobar un diálogo se muestra en la pantalla? (mediante ActivityInstrumentationTestCase2)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.