2011-08-05 17 views
5

Soy nuevo en Android Testing stuff. Me gustaría probar si al hacer clic en un botón se abre una actividad correspondiente o no. Hice algunas investigaciones y descubrí que necesitaré usar ActivityManager para hacer la verificación.Cómo llamar a Button.performClick en el caso de prueba JUnit de Android?

El problema es que no puedo hacer funcionar la parte de "hacer clic". Estoy tratando de usar Button.performClick().

Inicialmente acabo de llamar a esta función y recibí un error al decir que no puedo hacer esto en el hilo actual. Después de buscar en Google descubrí que necesito llamarlo en el hilo de la interfaz de usuario, y me encontré con runOnUiThread(Runnable r) method.

El botón que estoy intentando hacer clic es _helloButton_. Esto se obtiene en el _setUp()_ method. Hice _assertNotNull_ reviso esto para asegurarme de que esté ahí.

Dentro de un método de ensayo, me llaman

mActivity.runOnUiThread(new Runnable() { 
     public void run() { 
      helloButton.requestFocus(); 
     } 
    }); 
helloButton.performClick(); 

y me da una NPE en la línea llamando requestFocus().

siguiente que intentó

mActivity.runOnUiThread(new Runnable() { 
     public void run() { 
      helloButton.performClick(); 
     } 
    }); 

y aún así obtener la misma excepción de puntero nulo.

En la perspectiva de JUnit, me sale 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 tener 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) 

línea 57 es donde yo estoy llamando a la helloButton.performClick().

No estoy seguro de por qué estoy recibiendo NPE; assertNotNull pasa sin problema. Si me pueden ayudar con este problema, realmente lo agradecería. Gracias por adelantado.

EDITAR: Estoy subclasando ActivityInstrumentationTestCase2 para esta clase de prueba en particular.

EDIT2: Logcat vomita algunos errores antes de que ocurra NPE.

veo

08-05 20: 08: 54.702: ERROR/Android Runtime (754): ERROR: Hilo de adjuntar no

y

08-05 20: 08: 58.642: ERROR/gralloc (52): [anular el registro] manejar 0x3e1b28 aún bloqueado (estado = 40000001)

+0

Para mayor claridad, desea presionar un botón que activará el lanzamiento de una nueva actividad? –

+0

sí. El botón tiene un onClickListener, que inicia otra actividad. –

Respuesta

15

Puede anotar su prueba a ejecutar en el subproceso de 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 Android Application Testing Guide.

+0

Usted acaba de salvar mi día, señor. ¡Gracias! –

-1

está tomando un enfoque demasiado difícil para un problema simple ...en esencia lo que necesita el código estructurado como éste cuidado, este 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

+0

Sé cómo funciona ese método, pero eso no es lo que tengo que hacer aquí. Este es un caso de prueba JUnit; todos los oyentes click click ya están definidos. Simplemente necesito poder hacer clic dentro del método de caso de prueba. –

0

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(); 
      } 
     }); 

    } 
Cuestiones relacionadas