Espresso.pressBack() 不调用 onBackPressed()

Espresso.pressBack() does not call onBackPressed()

浓缩咖啡 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();
}

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

}

当我调用 Espresso 测试方法时,执行直接进入 finish()

当我在 Activity 中按下后退按钮(用手)时,执行首先进入 onBackPressed(),然后进入 finish()。 如何使用 Espresso 测试函数 onBackPressed()? 谢谢!

编辑: 这是我的错误。问题是在我想调用 pressBack 的 Activity 中,屏幕键盘被打开了。当软键盘打开时,按钮不会调用 onBackPressed 而是使键盘不显示。我尝试连续使用两个 pressBack() 并且它工作正常:

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

}

如果您不在根 activity 中,Espresso.pressBack() 方法似乎确实按照您期望的方式工作。当您查看它的实施评论时:

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

我测试了它,如果你在一个不是你的根 activity 的 activity 中这样做,它工作正常。如果你想在那里做,我建议你改用 ui-automator(ui-automator 在 espresso 测试中完全可用):

将此添加到您的 gradle:

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

然后在你的测试中这样做:

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

@billst 你是对的,我也有同样的软键盘打开问题,我在阅读你的评论后进行了调试,更好的解决方案是使用 ViewAction.closeSoftKeyboard() 而不是使用两次后退。

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