2012-02-23 10 views

Respuesta

30

Es necesario ActivityMonitor, le ayuda a moniotor actividad reciente apertura durante la instrumentación, visita nuestra pseudo código a continuación:

public void testOpenNextActivity() { 
    // register next activity that need to be monitored. 
    ActivityMonitor activityMonitor = getInstrumentation().addMonitor(NextActivity.class.getName(), null, false); 

    // open current activity. 
    MyActivity myActivity = getActivity(); 
    final Button button = (Button) myActivity.findViewById(com.company.R.id.open_next_activity); 
    myActivity.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     // click button and open next activity. 
     button.performClick(); 
    } 
    }); 

    //Watch for the timeout 
    //example values 5000 if in ms, or 5 if it's in seconds. 
    NextActivity nextActivity = getInstrumentation().waitForMonitorWithTimeout(activityMonitor, 5000); 
    // next activity is opened and captured. 
    assertNotNull(nextActivity); 
    nextActivity .finish(); 
} 
+0

conseguir error en esta línea de NextActivity nextActivity = getInstrumentation() waitForMonitorWithTimeout (activityMonitor, 5).; ¿Qué es NextActivity ??? El error es: Tipo no coincidente: no se puede convertir de Activity a ActivityHome – John

+0

@John NextActivity nextActivity = (NextActivity) getInstrumentation(). WaitForMonitorWithTimeout (activityMonitor, 5); intente poner cast para la siguiente actividad funcionará – Manoj

+0

@John funciona para usted – Manoj

11
NextActivity nextActivity = getInstrumentation().waitForMonitorWithTimeout(activityMonitor, 5); 

El parámetro 5, que se menciona en el método de la respuesta anterior es en milisegundos, no en segundos. Entonces, si es 5, a veces se falla el caso de prueba porque en 5 milisegundos no puede cargar la siguiente actividad. Entonces 5000 o 10000 milisegundos definitivamente funcionarán mejor. En la documentación lo han dado en segundos, pero de hecho es en milisegundos. El siguiente método funcionará mejor que el método anterior.

NextActivity nextActivity = getInstrumentation().waitForMonitorWithTimeout(activityMonitor, 10000); 
+0

Gracias Bro muy útil .... –

+1

+1 para señalar MiliSeconds !!! – Entreco

0

Para una prueba ActivityUnitTestCase, puede utilizar getStartedActivityIntent() para comprobar si la intención de que se pasó a una llamada startActivity().

protected Intent waitForStartedActivityIntent(int timeout) { 
    long endTime = SystemClock.uptimeMillis() + timeout; 
    while (SystemClock.uptimeMillis() <= endTime) { 
     Intent intent = getStartedActivityIntent(); 
     if (intent != null) { 
      return intent; 
     } 
    } 
    return null; 
} 

Crédito: waitFor... logic was inspired by this answer

Nota: con un ActivityUnitTestCase, la actividad no realmente empezar; la llamada es devorada por un padre simulado establecido por el caso de prueba.

0

Puede utilizar ActivityMonitor o Instrumentation saber se pone en marcha la actividad de destino o no tener gusto debajo

public void testButton() { 
    Instrumentation.ActivityMonitor activityMonitor = getInstrumentation() 
      .addMonitor(TargetActivity.class.getName(), null, false); 
    //button.performClick(); // Dont use this method 
    TouchUtils.clickView(this, button); 
    TargetActivity targetActivity = (TargetActivity) activityMonitor.waitForActivity(); // By using ActivityMonitor 
    // TargetActivity targetActivity = (TargetActivity) activityMonitor.waitForActivityWithTimeout(5);// It also works 
    // TargetActivity targetActivity = (TargetActivity) getInstrumentation().waitForMonitor(activityMonitor); // By using Instrumentation 
    // TargetActivity targetActivity = (TargetActivity) getInstrumentation().waitForMonitorWithTimeout(activityMonitor, 5); // It also works 
    assertNotNull("Target Activity is not launched", targetActivity); 
    } 
Cuestiones relacionadas