Espresso:如何通过结果RESULT_OK

时间:2015-11-18 11:19:32

标签: android android-intent android-espresso

在我的应用程序中,当用户点击"注册"按钮,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,如何使用setResult(RESULT_OK)检查活动是否完成。

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

3 个答案:

答案 0 :(得分:8)

所有setResult(...)方法都是更改Activity类

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

因此我们可以使用Java Reflection访问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);
}

答案 1 :(得分:3)

您只需使用ActivityTestRule并获取活动结果,如下所示:

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

完整示例here

答案 2 :(得分:0)

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