Espresso:如何测试 activity 以结果 RESULT_OK 结束

Espresso: How can I test that the activity finished with result RESULT_OK

在我的应用程序中,当用户单击 "Register" 中的按钮时,将启动 RegisterActivity。用户填写表格后,详细信息将发布到 Web 服务,如果注册成功,RegisterActivity 将以 RESULT_OK 结束。下面的代码示例总结了这一点:

public void submitRegistration() {

    showProgressDialog(R.string.registration, R.string.please_wait);  

    getWebApi().register(buildRegistrationFromUI(), new Callback<ApiResponse>() {
        @Override
        public void success(ApiResponse apiResponse, Response response) {

            hideProgressDialog();

            setResult(RESULT_OK);
            finish();
        }

        @Override
        public void failure(RetrofitError error) {

            hideProgressDialog();
            showErrorDialog(ApiError.parse(error));
        }
    });
}

使用 Espresso,如何检查 activity 是否已完成 setResult(RESULT_OK)

请注意:我不想创建模拟意图,我想检查意图结果状态。

setResult(...) 方法所做的只是更改 Activity class

中字段的值
 public final void setResult(int resultCode, Intent data) {
    synchronized (this) {
        mResultCode = resultCode;
        mResultData = data;
    }
}

所以我们可以使用Java反射来访问mResultCode字段来测试该值是否确实被设置为RESULT_OK。

@Rule
public ActivityTestRule<ContactsActivity> mActivityRule = new ActivityTestRule<>(
        ContactsActivity.class);


@Test
public void testResultOk() throws NoSuchFieldException, IllegalAccessException {
    Field f = Activity.class.getDeclaredField("mResultCode"); //NoSuchFieldException
    f.setAccessible(true);
    int mResultCode = f.getInt(mActivityRule.getActivity());

    assertTrue("The result code is not ok. ", mResultCode == Activity.RESULT_OK);
}

不确定我是否理解正确。但是,在关闭 activity 时,如果主应用程序仍处于打开状态,您可以检查 activity 结果。您需要在应用程序代码中公开结果状态,并且必须编写视图匹配器来验证它是否与预期匹配。

您可以简单地使用 ActivityTestRule 并得到 Activity 这样的结果:

assertThat(rule.getActivityResult(), hasResultCode(Activity.RESULT_OK));
assertThat(rule.getActivityResult(), hasResultData(IntentMatchers.hasExtraWithKey(PickActivity.EXTRA_PICKED_NUMBER)));

完整示例可用 here