Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 正在测试名为setResult的活动_Android_Unit Testing_Testing_Android Activity - Fatal编程技术网

Android 正在测试名为setResult的活动

Android 正在测试名为setResult的活动,android,unit-testing,testing,android-activity,Android,Unit Testing,Testing,Android Activity,我正在为一个活动编写测试(我的测试类扩展了ActivityInstrumentationTestCase2),我已经编写了一些基本测试,并且运行良好 但是,当我的活动完成时,它会通过setResult(resultcode,Intent i)向调用活动返回额外的数据。我希望使用指令插入完成我的活动,然后检查它在setResult调用中传递的内容 是否有一些框架提供的方法来实现这一点?我还没有找到任何东西,一种方法是对activity类进行子类化并重写setResult以使其记住并公开传递给set

我正在为一个活动编写测试(我的测试类扩展了ActivityInstrumentationTestCase2),我已经编写了一些基本测试,并且运行良好

但是,当我的活动完成时,它会通过setResult(resultcode,Intent i)向调用活动返回额外的数据。我希望使用指令插入完成我的活动,然后检查它在setResult调用中传递的内容


是否有一些框架提供的方法来实现这一点?我还没有找到任何东西,一种方法是对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);