我正在尝试使用Robolectric运行时为活动创建一个额外的意图。由于我们使用依赖注入的方式,我需要在调用onCreate方法之前调用Activity默认构造函数。这样我就可以在onCreate之前为我们注入的变量设置一些模拟。
我的目标是创建一个Activity对象,对活动中保存的字段执行一些初始化,然后调用活动生命周期方法以包含具有额外数据包的intent。
使用Robolectric创建和启动活动的标准方法是这样的:
Robolectric.buildActivity(Activity.class)
.withIntent(intent)
.create()
.visible()
.start()
.resume()
.get();
我试图将调用分成两部分,所以我创建了ActivityController并从中获取了Activity。一旦我的onCreate初始化完成,我就会使用ActivityController来调用Activity生命周期方法,如下所示:
ActivityController controller = Robolectric.buildActivity(Activity.class);
Activity activity = ac.get();
/* Do some activity related initialisation */
controller
.withIntent(intent)
.create()
.visible()
.start()
.resume()
.get();
不幸的是,这将无法编译,因为编译器会在.create()
之后对.withIntent(intent)
进行对象,即使它非常乐意将调用直接链接到返回ActivityController的Roboectric.buildActivity
后面。
我尝试移动withIntent(intent)
,如下所示
ActivityController controller = Robolectric.buildActivity(Activity.class)
.withIntent(intent);
Activity activity = ac.get();
/* Do some activity related initialisation */
controller
.create()
.visible()
.start()
.resume()
.get();
一切似乎都运行正常,但随后创建活动的意图似乎失去了额外的捆绑。我们将非常感激地提出有关如何实现我的目标的任何建议
PS我知道在Activity中调用默认构造函数是你在应用程序中永远不会做的事情,但这仅适用于单元测试。
答案 0 :(得分:1)
我最终发现了我的错误。我没有用正确的通用类型声明我的方法。以下方法声明正确编译,并且意图数据在其生命周期方法中传递给活动。
public static ActivityController createActivityController(Class clazz) {
return Robolectric.buildActivity(clazz);
}
public static <T extends FragmentActivity> void startControllerActivity(ActivityController<T> activityController, Intent intent) {
activityController
.withIntent(intent)
.create()
.visible()
.start()
.resume();
}
所以单元测试设置看起来像这样......
ActivityController<MyActivity> activityController = createActivityController(MyActivity.class);
MyActivity activity = activityController.get();
activity.setSomeProperty(1);
Intent intent = new Intent();
intent = new Intent(Robolectric.application.getApplicationContext(), MyActivity.class);
intent.putExtra(EXTRA_KEY, "Extra value");
startControllerActivity(activityController, intent);