【问题标题】: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);
        }
      }
      

      【讨论】:

        【解决方案3】:

        另一种方法是使用现代模拟框架,如 jmockit - 这样您就可以 在没有模拟器等的情况下模拟 android 类的行为。您可以在我的单元测试中看到它的示例:https://github.com/ko5tik/jsonserializer(以前的版本适用于与 android 捆绑的 JSON,实际适用于 GSON,但仍然存在模拟逻辑)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多