2012-02-03 18 views
6

Tengo un caso de prueba que usa Instrumentation.ActivityMonitor para comprobar si se envió un Intent. Esto funciona bien cuando la prueba tiene éxito. Si la aserción falla, el siguiente caso de prueba se bloquea en la llamada getActivity() en setUp().Android ActivityMonitor failure causa que getActivity() nunca devuelva

¿Se supone que debo hacer una llamada con algún método para limpiar?

Parece que gira en torno al lanzamiento de una actividad, pero el ActivityMonitor no lo detecta. Es decir, IntentFilter no se activó. La prueba falla pero la nueva Actividad nunca se descarta y parece interferir con la próxima llamada a getActivity().

Este problema es similar to another question, pero esta solución (llamar a super.tearDown()) no solucionó mi problema.

public class SimpleActivityTest 
    extends ActivityInstrumentationTestCase2<SimpleActivity> { 

    private SimpleActivity activity; 

    @Override 
    protected void setUp() throws Exception { 
     super.setUp(); 
     this.getInstrumentation().setInTouchMode(false); 

     Intent intent = new Intent(); 
     intent.putExtra("DATA_ITEM_1", 1); 
     intent.putExtra("DATA_ITEM_2", 2); 
     this.setActivityIntent(intent); 

     this.activity = getActivity(); // this call hangs on second test 
    } 

    public void testOtherActivityCalled() { 
     IntentFilter ifilter = new IntentFilter(Intent.ACTION_VIEW); 
     ifilter.addDataScheme("http"); 
     ifilter.addDataAuthority("some.domain.com", null); 
     ifilter.addDataPath("foobar", PatternMatcher.PATTERN_PREFIX); 

     ActivityMonitor activityMonitor = getInstrumentation().addMonitor(
       ifilter, null, false); 

     activity.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       // launch other activity somehow 
      } 
     }); 
     getInstrumentation().waitForIdleSync(); 

     Activity otherActivity = activityMonitor.waitForActivityWithTimeout(2000); 
     assertNotNull(otherActivity); 
     otherActivity.finish(); 
    } 

    public void testSomethingElse() { 
     // This code will never run because getActivity() in setUp() will 
     // never return 
    } 
} 
+0

¿resolvió este problema? Tengo lo mismo, y no sé cómo solucionarlo :( – dexxtr

Respuesta

1

I sospechoso que el Ejecutable que haya creado nunca se está saliendo. Dado que se ejecuta en el subproceso de interfaz de usuario, nunca permite que el ciclo de vida de la actividad haga lo que necesita. ¿Hay alguna razón en particular para hacerlo desde el hilo de la interfaz de usuario?

+0

El waitForIdleSync() asegura que el subproceso de la interfaz de usuario está terminado. Uso el subproceso de la interfaz de usuario para hacer selecciones de lista o hacer clic en los botones. Esos clics pasan por lo que sé el Runnable termina. – Cristian

0

Tuve problemas similares, así que comencé a usar la biblioteca Robotium. Cierro todas las actividades en el método tearDown():

protected void setUp() throws Exception { 
     super.setUp(); 
     mSolo = new Solo(getInstrumentation(), getActivity()); 
    } 
protected void tearDown() { 
     mSolo.finishOpenedActivities(); 
     mSolo.finishInactiveActivities(); 
    } 
Cuestiones relacionadas