Espresso:如何使用结果RESULT_OK测试活动结束

W.K*_*K.S 7 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));
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

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

请注意:我希望创建一个模拟的意图,我想查的意图结果状态.

Eri*_*Liu 8

所有setResult(...)方法都是更改Activity类中字段的值

 public final void setResult(int resultCode, Intent data) {
    synchronized (this) {
        mResultCode = resultCode;
        mResultData = data;
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,我们可以使用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);
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*rdi 5

您可以简单地使用 anActivityTestRule并像这样获得 Activity 结果:

assertThat(rule.getActivityResult(), hasResultCode(Activity.RESULT_OK));
assertThat(rule.getActivityResult(), hasResultData(IntentMatchers.hasExtraWithKey(PickActivity.EXTRA_PICKED_NUMBER)));
Run Code Online (Sandbox Code Playgroud)

完整示例可在此处获得