2016-03-08 12 views
15

Desidero affermare che la mia attività che sto attualmente testando è terminata quando vengono eseguite determinate azioni. Purtroppo fino ad ora sono solo per asserirlo aggiungendo un po 'di sonno alla fine del test. C'è un modo migliore ?Espresso come testare se l'attività è finita?

import android.content.Context; 
import android.os.Build; 
import android.support.test.rule.ActivityTestRule; 
import android.test.suitebuilder.annotation.LargeTest; 

import org.junit.Before; 
import org.junit.Rule; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.junit.runners.JUnit4; 

import static org.junit.Assert.assertTrue; 

@SuppressWarnings("unchecked") 
@RunWith(JUnit4.class) 
@LargeTest 
public class MyActivityTest { 

    Context context; 

    @Rule 
    public ActivityTestRule<MyActivity> activityRule 
      = new ActivityTestRule(MyActivity.class, true, false); 

    @Before 
    public void setup() { 
     super.setup(); 
     // ... 
    } 

    @Test 
    public void finishAfterSomethingIsPerformed() throws Exception { 

     activityRule.launchActivity(MyActivity.createIntent(context)); 

     doSomeTesting(); 

     activityRule.getActivity().runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       fireEventThatResultsInTheActivityToFinishItself(); 
      } 
     }); 

     Thread.sleep(2000); // this is needed :(

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      assertTrue(activityRule.getActivity().isDestroyed()); 
     } 

    } 

} 

risposta

0

È possibile utilizzare l'esempio StartActivityForResult di seguito, ulteriori descrizioni nei collegamenti.

Come avviare attività da FirstActivity:

Intent i = new Intent(this, SecondActivity.class); 
startActivityForResult(i, 1); 

Ecco come finire la vostra SecondActivity per tornare alla prima (senza l'invio di risultato):

Intent returnIntent = new Intent(); 
setResult(Activity.RESULT_CANCELED, returnIntent); 
finish(); 

come allevare eventi quando SecondActivity è finito (è scritto in FirstActivity):

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

    if (requestCode == 1) { 

    } 
}//onActivityResult 

Altro che potete trovare qui: http://developer.android.com/training/basics/intents/result.html e lì How to manage `startActivityForResult` on Android? c'è anche come è possibile inviare i dati che si desidera ottenere da SecondActivity.

+0

Grazie per la risposta. Immagino di non essere stato abbastanza chiaro. Il mio problema è che non ho una seconda attività o una prima attività. Ho solo un'attività. Quindi posso usare la tua soluzione solo se inizio un'attività fittizia solo per essere in grado di avviare Activtiy che voglio testare da lì .. – IHeartAndroid

+0

in modo da avere la tua eseguibile e vuole fare qualcosa dopo aver finito? –

+0

Voglio assicurarmi che la mia attività sia chiusa dopo fireEventThatResultsInTheActivityToFinishItself(); Si chiama – IHeartAndroid

28

Nel mio caso posso testare per isFinishing():

assertTrue(activityTestRule.getActivity().isFinishing());

invece di:

Thread.sleep(2000); // this is needed :(

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
     assertTrue(activityRule.getActivity().isDestroyed()); 
    } 

Un altro vantaggio di isFinishing() è, che non è necessario il controllo della versione.

+0

Certo, usare 'isFinishing()' è bello, ma non si sta affrontando il punto principale della domanda, che è come aggirare il sonno. –

+0

Nella mia comprensione il PO chiedeva un modo migliore per affermare, così da poter evitare il 'Thread.sleep'. – keineantwort

+1

Ho notato che è possibile evitare 'Thread.sleep()' dopo aver testato il codice. Comunque hai dimenticato di dirlo, quindi ho modificato la tua risposta per rendere il punto più esplicito. –

0

Non so se è una buona pratica, ma questo ha funzionato per me:

assertTrue(mTestRule.getActivity() == null); 
Problemi correlati