Android 正在测试名为setResult的活动
我正在为一个活动编写测试(我的测试类扩展了ActivityInstrumentationTestCase2),我已经编写了一些基本测试,并且运行良好 但是,当我的活动完成时,它会通过setResult(resultcode,Intent i)向调用活动返回额外的数据。我希望使用指令插入完成我的活动,然后检查它在setResult调用中传递的内容Android 正在测试名为setResult的活动,android,unit-testing,testing,android-activity,Android,Unit Testing,Testing,Android Activity,我正在为一个活动编写测试(我的测试类扩展了ActivityInstrumentationTestCase2),我已经编写了一些基本测试,并且运行良好 但是,当我的活动完成时,它会通过setResult(resultcode,Intent i)向调用活动返回额外的数据。我希望使用指令插入完成我的活动,然后检查它在setResult调用中传递的内容 是否有一些框架提供的方法来实现这一点?我还没有找到任何东西,一种方法是对activity类进行子类化并重写setResult以使其记住并公开传递给set
是否有一些框架提供的方法来实现这一点?我还没有找到任何东西,一种方法是对activity类进行子类化并重写setResult以使其记住并公开传递给setResult的内容(结果表明setResult是最终的,所以您也不能这样做),似乎应该有更好的方法。另一种方法是使用像jmockit这样的现代模拟框架-这样您可以
在没有emulator的情况下模拟android类的行为等。您可以在我的单元测试中看到它的示例:(以前的版本针对与android捆绑的JSON工作,而实际针对GSON,但模拟逻辑仍然存在)请看我对另一个类似问题的回答: 您可以使用反射并直接从活动中获取值
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);
}
}
正如我在另一个问题中回答的那样,您还可以使用和隐藏测试中的活动。然后,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());
}
对于Robolectric 3+更换
ShadowActivity shadowActivity = Robolectric.shadowOf(mActivity);
与
ShadowActivity shadow = Shadows.shadowOf(activity);