完成后从活动中获取结果(); 在Androidunit testing中

我目前正在编写一些Androidunit testing,虽然我得到的东西大部分都是按我想要的方式工作,但有一件事情让我感到难堪。

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

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

我想弄清楚如何使用Instrumentation(或其他)能够读取活动的结果,或在活动完成后得到意图。 谁能帮忙?

Solutions Collecting From Web of "完成后从活动中获取结果(); 在Androidunit testing中"

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

 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); } } 

或者你也可以使用Robolectric,并在testing中隐藏活动。 然后,ShadowActivity为您提供了一些方法,可以轻松地知道“活动”是否正在完成以及是否检索其结果代码。

举个例子,我的一个testing看起来像这样:

 @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()); } 

你可以通过编写一个特殊的活动来做到这一点,这个活动的唯一目的是开始你正在testing的结果的活动,并保存结果,以便你声明正确性。

例如,您可以创build一个名为ResultReceiverActivity的活动。 给它三种方法: getResultCodegetResultDatagetReceivedRequestCode ,它们可以用来validation被testing的活动是否返回了正确的值。 您将创build一个扩展ActivityInstrumentationTestCase2的testing用例,通用参数为ResultReceiverActivity 。 调用getActivity将为您提供活动实例。

 public class ReturnedResultTest extends ActivityInstrumentationTestCase2<ResultReceiverActivity> { public void testReturnedResult() { ResultReceiverActivity a = getActivity(); assertEquals(Activity.RESULT_OK, a.getResultCode()); assertEquals("myResult", a.getResultData().getStringExtra("test")); assertEquals(0x9999, a.getReceivedRequestCode()); } } 

当然, ResultReceiverActivity需要重载onActivityResult ,并且只需要将方法参数的值存储在其字段中,如下所示:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); this.receivedRequestCode = requestCode; this.resultCode = resultCode; this.resultData = data; } 

当然,您可能需要自定义ResultReceiverActivity启动的活动,并且您可以通过在其onCreate方法中使用getIntent来轻松完成此操作。 在您的testing案例中,在调用getActivity设置使用哪个Intent来启动活动之前调用setActivityIntent。

我不确定unit testing是否有所不同,但您应该能够使用onActivityResult,如下所示: StartingActivities 。 您只需使用startActivityForResult(intent,requestCode)启动Activity,然后使用

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) 

回到使用startActivityForResult的活动中。