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();
}
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: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:
And then do this in your test:
@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.