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