Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Espresso.pressBack() does not call onBackPressed()

In Espresso class:

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

In Activity:

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

When I call the Espresso test method the execution goes directly to finish().

When I press the back button (with my hand) in the Activity the execution goes firstly in onBackPressed() and then to finish(). How can I test the function onBackPressed() with Espresso? Thanks!

EDIT: It is my error. The problem was that in Activity in which I wanted to call pressBack the onscreen keyboard was opened. When the soft keyboard is open then the press-button does not call onBackPressed but instead makes the keyboard non-displayed. I tried with two pressBack() in a row and it worked correctly:

    @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();  } 
like image 638
billst Avatar asked Mar 17 '17 15:03

billst


2 Answers

It looks like the Espresso.pressBack() method does just work the way you expect it if you are not in the root activity. When you take a look at it's implementation comment:

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

I tested it and it works fine if you are doing this in an activity that is not your root activity. If you want to do it there, I would suggest you use ui-automator instead (ui-automator is perfectly usable inside espresso tests):

Add this to your gradle:

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

And then do this in your test:

UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); mDevice.pressBack(); 
like image 106
stamanuel Avatar answered Oct 07 '22 19:10

stamanuel


@billst you are right, i too had the same problem with soft keyboard open, i debugged after reading your comment and better solution would be to use ViewAction.closeSoftKeyboard() instead of using back press twice.

@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())); } 
like image 21
KingKongCoder Avatar answered Oct 07 '22 20:10

KingKongCoder