2012-08-02 10 views
6

Sto provando a testare due diverse classi Activity, in cui uno si trova a chiamare Activity. Ecco il mio codice e poi vi spiego il problema:metodo getActivity() blocco a tempo indeterminato durante il test dell'unità

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

In IntroActivityTest, se il token utente SharedPreferences non è nullo, si inizia subito RootActivity. Se è nullo, rimane su IntroActivity. Il problema è che se non è nullo, passa il primo test (IntroActivityTest), quindi si blocca sulla chiamata del metodo getActivity() in RootActivityTest e il test si blocca solo ... senza eccezioni, si blocca su quella riga. Se il token utente è nullo, esegue entrambi i test completamente bene.

Cosa potrebbe causare questo? Dall'osservazione, sembra che RootActivityTest stia tentando di utilizzare RootActivity avviato da IntroActivity, ma non dovrebbe iniziare la propria istanza di RootActivity?

risposta

7

Secondo il ActivityInstrumentationTestCase2 API:

Questa classe fornisce test funzionale di una singola attività. L'attività in prova verrà creata utilizzando l'infrastruttura di sistema (chiamando InstrumentationTestCase.launchActivity()) e sarai quindi in grado di manipolare direttamente la tua attività.

Ogni implementazione di ActivityInstrumentationTestCase2 è completamente isolata e ha un proprio ciclo di vita che non dipende da altre implementazioni di ActivityInstrumentationTestCase2. Un'attività testabile deve sempre essere creata tramite l'infrastruttura di strumentazione, non dall'applicazione in esame. Nel tuo caso, RootActivityTest non rileva RootActivity avviato da IntroActivity dall'applicazione e test di esecuzione continua contro RootActivity. Se c'è una RootActivity che proviene da no dove (non da InstrumentationTestRunner) e viene portata in primo piano, quando si esegue RootActivityTest, InstrumentationTestRunner si confonderà quando tenterà di creare una RootActivity verificabile e si fermerà semplicemente in attesa che questo estraneo venga ucciso.

Per verificare ciò che si desidera, ovvero se il token utente da SharedPreferences è non null, avvia immediatamente RootActivity. Se è nullo, rimane su IntroActivity, è possibile scrivere tutto in IntroActivityTest e utilizzare Instrumentation.ActivityMonitor rilevando RootActivity avviato da IntroActivity. Controlla here per il codice di esempio. si noti che è necessario completare RootActivity dopo aver eseguito i test in IntroActivityTest in modo che RootActivity possa essere avviato correttamente quando si chiama getActivity() in RootActivityTest.

Utilizzare RootActivityTest per testare tutto ciò che è correlato a RootActivity dopo che è stato avviato e portato in primo piano, ad esempio, TextView è ben visualizzato, fare clic con il pulsante fare la cosa giusta ecc. In RootActivityTest, non è necessario preoccuparsi di dove e come viene avviata RootActivity, basta chiamare getActivity() e chiedere la strumentazione per una RootActivity verificabile.

+0

Ottima risposta! Nel mio caso, avevo bisogno di impostare il mio monitor _prima_ ho chiamato 'getActivity()' perché il mio nuovo 'Activity' stava iniziando in' onCreate() '. –

0

Ho affrontato lo stesso problema quando il test precedente non ha chiuso l'attività e il nuovo test è iniziato allo stesso modo con l'intento.Ma OS Android vede che l'attività è già iniziata e non ha fatto nulla, quindi InstrumentationTestCase ha iniziato ad attendere attività già avviata

Problemi correlati