16

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

因为buildActivity()控制 Activity 对象的构造,所以为 Activity 添加 spy 的唯一位置是在调用buildActivity(). 但是,在事后添加间谍时,间谍无法正常工作。

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

那么有什么方法可以监视正在使用 Robolectric 进行单元测试的 Activity,以便间谍在通过 Robolectric 调用生命周期方法时正常工作ActivityController

4

2 回答 2

4

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

我用Robolectric3.1测试了一下,没问题。

于 2016-08-10T08:20:30.057 回答
1

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

于 2014-01-13T07:31:45.153 回答