web-dev-qa-db-fra.com

Espresso.pressBack () n'appelle pas onBackPressed ()

En classe Espresso:

 @Rule
    public IntentsTestRule<MainActivity> mIntentsRule = new IntentsTestRule<>(
            MainActivity.class);

@Test
public void test_backButton(){
onView(withId(R.id.NEXT_ACTIVITY)).perform(scrollTo(), click());

Espresso.pressBack();
}

En activité:

 @Override
public void onBackPressed() {
    Log.d("TEST_pressBack", "inside onBackPressed()");
    do_something();
    super.onBackPressed();

}
   @Override
public void finish() {
    Log.d("TEST_pressBack", "inside finish()");
    super.finish();

}

Lorsque j'appelle la méthode de test Espresso, l'exécution va directement à finish().

Lorsque j'appuie sur le bouton de retour (avec ma main) dans le Activity l'exécution va d'abord dans onBackPressed() puis dans finish(). Comment puis-je tester la fonction onBackPressed() avec Espresso? Merci!

EDIT: C'est mon erreur. Le problème était que dans l'activité dans laquelle je voulais appeler pressBack, le clavier à l'écran était ouvert. Lorsque le clavier virtuel est ouvert, le bouton-poussoir n'appelle pas onBackPressed mais rend le clavier non affiché. J'ai essayé avec deux pressBack () d'affilée et cela a fonctionné correctement:

    @Rule
    public IntentsTestRule<MainActivity> mIntentsRule = new IntentsTestRule<>(
            MainActivity.class);

@Test
public void test_backButton(){
onView(withId(R.id.NEXT_ACTIVITY)).perform(scrollTo(), click());

Espresso.pressBack();

//The extra pressBack()
Espresso.pressBack();

}
16
billst

Il semble que la méthode Espresso.pressBack() fonctionne comme vous l'attendez si vous n'êtes pas dans l'activité root. Lorsque vous regardez son commentaire d'implémentation:

  /**
  * Press on the back button.
  *
  * @throws PerformException if currently displayed activity is root activity, since pressing back
  *         button would result in application closing.
  */
  public static void pressBack() {
        onView(isRoot()).perform(ViewActions.pressBack());
  }

Je l'ai testé et cela fonctionne très bien si vous faites cela dans une activité qui n'est pas votre activité racine. Si vous voulez le faire là-bas, je vous suggère d'utiliser plutôt ui-automator (ui-automator est parfaitement utilisable dans les tests expresso):

Ajoutez ceci à votre gradle:

androidTestCompile 'com.Android.support.test.uiautomator:uiautomator-v18:2.1.2'

Et puis faites ceci dans votre test:

UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
mDevice.pressBack();
32
stamanuel

@billst vous avez raison, j'ai également eu le même problème avec le clavier logiciel ouvert, j'ai débogué après avoir lu votre commentaire et la meilleure solution serait d'utiliser ViewAction.closeSoftKeyboard () au lieu d'utiliser deux fois la contre-pression.

@Test
public void afterStartedEditing_dialogDisplayed_when_home_or_back_pressed() {
    //find view
    onView(withId(R.id.add_pet_breed))
            .perform(click())
            .perform(closeSoftKeyboard());
    onView(isRoot()).perform(pressBack());

    //check assertion
    onView(withText(R.string.discard))
            .check(matches(isDisplayed()));
}
2
Random Aspirer