2012-08-02 13 views
6

Estoy tratando de probar dos clases Activity diferentes, donde una Activity pasa a llamar a la otra. Aquí está mi código y luego voy a explicar el problema:metodo getActivity() bloqueando indefinidamente mientras prueba la unidad

IntroActivityTest

public class IntroActivityTest extends ActivityInstrumentationTestCase2<IntroActivity> { 

    IntroActivity activity; 

    public IntroActivityTest() { 

     super(IntroActivity.class); 
    } 

    @Override 
    protected void setUp() throws Exception { 

     super.setUp(); 
     activity = getActivity(); 
    } 

    public void testIntroBypass() { 

     if (new SharedPreferencesHelper(getInstrumentation().getTargetContext()).retrieveUserToken() == null) { 
      assertTrue(!activity.isFinishing()); 
     } 
     else { 
      assertTrue(activity.isFinishing()); 
     } 
    } 
} 

RootActivityTest:

public class RootActivityTest extends ActivityInstrumentationTestCase2<RootActivity> { 

    RootActivity activity; 

    public RootActivityTest() { 

     super(RootActivity.class); 
    } 

    @Override 
    protected void setUp() throws Exception { 

     super.setUp(); 
     activity = getActivity(); 
    } 

    public void testInitialTab() { 

     assertTrue(activity.getSupportActionBar().getSelectedTab().getText().toString().equalsIgnoreCase("Library")); 
    } 
} 

En IntroActivityTest, si el token de usuario de SharedPreferences no es nulo, se inicia inmediatamente RootActivity. Si es nulo, permanece en IntroActivity. El problema es que si no es nulo, pasa la primera prueba (IntroActivityTest), y luego se cuelga en la llamada al método getActivity() en RootActivityTest y la prueba simplemente se congela ... sin excepciones, simplemente se cuelga en esa línea. Si el token de usuario es nulo, ejecuta ambas pruebas completamente bien.

¿Qué podría estar causando esto? Por observación, parece que RootActivityTest está intentando usar el RootActivity que se inició desde IntroActivity, pero ¿no debería estar comenzando su propia instancia de RootActivity?

Respuesta

7

Según la ActivityInstrumentationTestCase2 API:

Esta clase proporciona pruebas funcionales de una sola actividad. La actividad bajo prueba se creará utilizando la infraestructura del sistema (llamando a InstrumentationTestCase.launchActivity()) y luego podrá manipular su actividad directamente.

Cada implementación de ActivityInstrumentationTestCase2 está completamente aislada y tiene su propio ciclo de vida que no depende de otra implementación de ActivityInstrumentationTestCase2. Siempre se debe crear una actividad comprobable a través de la infraestructura de instrumentación, no desde la aplicación bajo prueba. En su caso, RootActivityTest no recogerá RootActivity iniciado por IntroActivity de la aplicación y la prueba de ejecución continua contra RootActivity. Si hay una RootActivity que viene de ninguna parte (no por InstrumentationTestRunner) y se pone al frente, al ejecutar RootActivityTest, InstrumentationTestRunner se confundirá cuando intente crear una RootActivity comprobable, y simplemente se detendrá y esperará a que muera este desconocido.

Para probar lo que desea, es decir, si el token de usuario de SharedPreferences no es nulo, inmediatamente inicia RootActivity. Si es nulo, permanece en IntroActivity, puede escribir todo en IntroActivityTest y usar Instrumentation.ActivityMonitor detectando RootActivity iniciado desde IntroActivity. Consulte here para ver el código. Tenga en cuenta que necesita finalizar RootActivity después de realizar la prueba en IntroActivityTest para que RootActivity pueda iniciarse correctamente al llamar a getActivity() en RootActivityTest.

Utilice RootActivityTest para probar todo lo relacionado con RootActivity una vez que se haya iniciado y presentado, por ejemplo, TextView está bien renderizado, haga clic en hacer lo correcto y etc. En RootActivityTest, no necesita preocuparse de dónde y cómo se inicia RootActivity, simplemente llame a getActivity() y solicite a los instrumentos una RootActivity comprobable.

+0

¡Excelente respuesta! En mi caso, necesitaba configurar mi monitor _antes_ llamé 'getActivity()' porque mi 'Activity' nueva comenzaba en' onCreate() '. –

0

Tuve el mismo problema cuando la prueba anterior no cerró la actividad, y la nueva prueba comenzó igual con la intención.Pero el sistema operativo Android ve que la actividad ya se inició y no hizo nada, por lo que InstrumentationTestCase comenzó a esperar la actividad que ya se tsarted

Cuestiones relacionadas