完成后从活动中获取结果();在安卓单元测试中

我目前正在编写一些Android单元测试,虽然我已经让大多数事情按照我想要的方式工作,但有一件事让我有点陷入困境。

我在测试的活动中有以下代码:

Intent result = new Intent();
result.putExtra("test", testinput.getText().toString());
setResult(Activity.RESULT_OK, result);
finish();

我试图弄清楚如何使用检测(或其他任何东西)来读取活动的结果,或者在活动完成后获得意图。任何人都可以帮忙吗?


答案 1

您可以使用反射并直接从活动中获取值。

protected Intent assertFinishCalledWithResult(int resultCode) {
  assertThat(isFinishCalled(), is(true));
  try {
    Field f = Activity.class.getDeclaredField("mResultCode");
    f.setAccessible(true);
    int actualResultCode = (Integer)f.get(getActivity());
    assertThat(actualResultCode, is(resultCode));
    f = Activity.class.getDeclaredField("mResultData");
    f.setAccessible(true);
    return (Intent)f.get(getActivity());
  } catch (NoSuchFieldException e) {
    throw new RuntimeException("Looks like the Android Activity class has changed it's   private fields for mResultCode or mResultData.  Time to update the reflection code.", e);
  } catch (Exception e) {
    throw new RuntimeException(e);
  }
}

答案 2

或者,您也可以使用Robolectric并阴影测试中的活动。然后,ShadowActivity 为您提供了一些方法,可以轻松了解活动是否正在完成并检索其结果代码。

例如,我的一个测试如下所示:

@Test
public void testPressingFinishButtonFinishesActivity() {
    mActivity.onCreate(null);
    ShadowActivity shadowActivity = Robolectric.shadowOf(mActivity);

    Button finishButton = (Button) mActivity.findViewById(R.id.finish_button);
    finishButton.performClick();

    assertEquals(DummyActivity.RESULT_CUSTOM, shadowActivity.getResultCode());
    assertTrue(shadowActivity.isFinishing());
}

推荐