与Mockito间谍的Robolectric buildActivity()?

时间:2013-10-16 16:14:29

标签: android unit-testing mockito robolectric spy

在我看来,使用Robolectric的生命周期实用程序(从Robolectric.buildActivity()开始)构建活动单元测试并使用Mockito间谍监视同一个Activity是相互排斥的。

由于buildActivity()控制Activity对象的构造,因此在调用buildActivity()之后,唯一可以为Activity添加间谍的地方。然而,在事后添加间谍时,间谍无法正常运作。

在监视ActivityController生命周期方法(例如create()start()resume())的副作用时尤其如此。我假设这是因为ActivityController持有对“真正的”Activity对象的引用,而不是后来添加的间谍。

那么有没有办法窥探一个使用Robolectric进行单元测试的Activity,这样当通过Robolectric ActivityController调用生命周期方法时间谍正常工作?

2 个答案:

答案 0 :(得分:3)

答案是使用反射替换Activity中的“真实”ActivityController对象。

@Test
public void someTestMethod() throws NoSuchFieldException, IllegalAccessException {
    ActivityController<LoginActivity> ac = Robolectric.buildActivity(LoginActivity.class);
    LoginActivity spiedActivity = spy(ac.get());

    replaceComponentInActivityController(ac, spiedActivity);

    ac.create();

    // do your work
 }

public static void replaceComponentInActivityController(ActivityController<?> activityController, Activity activity)
        throws NoSuchFieldException, IllegalAccessException {
    Field componentField = ComponentController.class.getDeclaredField("component");
    componentField.setAccessible(true);
    componentField.set(activityController, activity);
}

我通过Robolectric 3.1测试它,没关系。

答案 1 :(得分:1)

至少对于活动不是被测对象的情况,只有一个虚拟活动来托管被测试的片段,可以将一个模拟注入到测试活动中,该活动可以验证与活动的交互。片段和活动之间的通信接口(关注http://developer.android.com/training/basics/fragments/communicating.html)。