web-dev-qa-db-fra.com

Espresso comment tester si l'activité est terminée?

Je veux affirmer que mon activité que je teste actuellement est terminée lorsque certaines actions sont effectuées. Malheureusement jusqu'à présent, je ne peux que l'affirmer en ajoutant un peu de sommeil à la fin du test. Y a-t-il une meilleure façon?

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

    }

}
23
IHeartAndroid

Dans mon cas, je peux tester isFinishing():

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

au lieu de:

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

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

Un autre avantage de isFinishing() est que vous n'avez pas besoin de la vérification de version.

46
keineantwort

Peut-être un peu tard mais c'est aussi possible:

assertThat(activityRule.getActivityResult(), hasResultCode(Activity.RESULT_CANCELED));
2
head01

Je ne sais pas si c'est une bonne pratique mais cela a fonctionné pour moi:

assertTrue(mTestRule.getActivity() == null);
0
SMR

Vous pouvez utiliser l'exemple StartActivityForResult ci-dessous, plus de descriptions dans les liens.

Comment démarrer l'activité à partir de FirstActivity:

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

Voilà comment terminer votre SecondActivity pour revenir en premier (sans envoyer de résultat):

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

Comment déclencher un événement lorsque SecondActivity est terminé (est écrit dans FirstActivity):

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

   if (requestCode == 1) {

   }
}//onActivityResult

Plus vous pouvez trouver ici: http://developer.Android.com/training/basics/intents/result.html et là Comment gérer `startActivityForResult` sur Android? vous pouvez également envoyer les données que vous souhaitez obtenir de SecondActivity.

0
kilian eller