在我看来,使用Robolectric的生命周期实用程序(从Robolectric.buildActivity()
开始)构建活动单元测试并使用Mockito间谍监视同一个Activity是相互排斥的。
由于buildActivity()
控制Activity对象的构造,因此在调用buildActivity()
之后,唯一可以为Activity添加间谍的地方。然而,在事后添加间谍时,间谍无法正常运作。
在监视ActivityController
生命周期方法(例如create()
,start()
和resume()
)的副作用时尤其如此。我假设这是因为ActivityController持有对“真正的”Activity对象的引用,而不是后来添加的间谍。
那么有没有办法窥探一个使用Robolectric进行单元测试的Activity,这样当通过Robolectric ActivityController
调用生命周期方法时间谍正常工作?
答案 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)。