Espresso.pressBack()不调用onBackPressed()

bil*_*lst 16 android android-espresso

在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();
}
Run Code Online (Sandbox Code Playgroud)

在活动中:

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

}
Run Code Online (Sandbox Code Playgroud)

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

当我按下后退按钮(用我的手)时Activity,执行首先进入onBackPressed()然后进入finish().如何onBackPressed()使用Espresso 测试功能?谢谢!

编辑:这是我的错误.问题是在我想调用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();

}
Run Code Online (Sandbox Code Playgroud)

sta*_*uel 35

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());
  }
Run Code Online (Sandbox Code Playgroud)

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

将此添加到您的gradle:

androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'
Run Code Online (Sandbox Code Playgroud)

然后在测试中执行此操作:

UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
mDevice.pressBack();
Run Code Online (Sandbox Code Playgroud)

  • 这是我的错误.问题是在我想调用pressBack的Activity中,屏幕键盘被打开了.当软键盘打开时,按下按钮不会调用onBackPressed,而是使键盘不显示.我尝试了两个pressBack()并且它正常工作 (3认同)
  • `Espresso.closeSoftKeyboard()` 将是上述问题的答案,但你的答案是我正在寻找的完美答案。非常感谢!:-) 对于未来的读者,这里是 androidx 版本:`androidTestImplementation 'androidx.test.uiautomator:uiautomator:2.2.0'` (2认同)
  • 注意有 `Espresso.pressBackUnconditionally()` (2认同)