2010-11-12 58 views
14

我正在为活动编写测试(我的测试类扩展了ActivityInstrumentationTestCase2),我已经编写了一些基本测试并且工作正常。测试一个名为setResult的活动

但是,当它完成后,我的活动通过setResult(resultcode,Intent i)将额外数据返回给调用活动。我想使用工具来完成我的活动,然后检查它在setResult调用中传递的内容。

有没有一些框架提供了这样做的方式?我还没有找到任何东西,一种方法是继承activity类并覆盖setResult以记住&公开了传递给setResult的内容(结果是setResult是final的,所以你也不能这样做) ,似乎应该有更好的方法。

回答

1

另一种方法是使用像jmockit这样的现代模拟框架 - 这种方式可以模拟不具有仿真器的android类的行为。您可以在我的单元测试中看到它的示例:https://github.com/ko5tik/jsonserializer(先前版本针对捆绑JSON Android和反对GSON实际,但嘲讽的逻辑仍然存在)

5

请参阅从另一个类似的问题,我的回答:

您可以使用反射和直接从活动抢值。

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

正如我在另questiom回答,您还可以使用Robolectric和被测影活动。然后,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);