【问题标题】:testing that an activity called setResult测试一个名为 setResult 的活动
【发布时间】:2011-05-08 19:50:58
【问题描述】:
我正在为一个活动编写测试(我的测试类扩展了 ActivityInstrumentationTestCase2),我已经编写了一些基本测试并且工作正常。
但是,当我的活动完成时,它会通过 setResult(resultcode, Intent i) 向调用活动返回额外的数据/p>
是否有一些框架提供的方法来做到这一点?我还没有找到任何东西,一种方法是子类化活动类并覆盖 setResult 让它记住并公开传递给 setResult 的内容(结果 setResult 是最终的,所以你也不能这样做) ,看来应该有更好的办法。
【问题讨论】:
标签:
android
unit-testing
testing
android-activity
【解决方案1】:
正如我在另一个问题中回答的那样,您也可以使用 Robolectric 并隐藏被测活动。然后,ShadowActivity 为您提供了轻松了解 Activity 是否正在完成并检索其结果代码的方法。
例如,我的一个测试如下所示:
@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());
}
对于 Robolectric 3+ 替换
ShadowActivity shadowActivity = Robolectric.shadowOf(mActivity);
与
ShadowActivity shadow = Shadows.shadowOf(activity);
【解决方案2】:
查看我对另一个类似问题的回答:
您可以使用反射并直接从 Activity 中获取值。
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);
}
}