在onCreate之前向Robolectric中的活动添加意图

时间:2015-06-15 19:23:14

标签: android android-intent robolectric

我正在尝试使用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中调用默认构造函数是你在应用程序中永远不会做的事情,但这仅适用于单元测试。

1 个答案:

答案 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);