使用带有意图的Robotium

时间:2013-03-25 14:16:23

标签: android robotium

我有一个带有列表视图的多个活动的应用程序,第一个列表视图中的选择决定了第二个列表视图的内容,第二个列表视图决定了第三个列表视图的内容等。

我想测试第三个列表视图,但因为它需要一个intent,所以列表什么都不返回。为了解决这个问题,我可以手动将意图添加到测试中,这意味着它可以正常工作

public InspectionListActivityTest() {
    super(InspectionListActivity.class);
    Intent i = new Intent();
    i.putExtra("guid", "abcbbf2b-5e14-4cb1-af1b-e3084b45d4cf");
    setActivityIntent(i);
}

从代码中可以看出,它使用guid来确定我想要避免的列表 - 我在测试时清理了很多数据库所以我必须一直更改这个字段。

理想情况下,我想使用ContentResolver从另一个表中获取第一个guid,这意味着我可以在我的测试中总是回收信息,即

public InspectionListActivityTest() {
    super(InspectionListActivity.class);

    ContentResolver cr = getActivity().getContentResolver();
    Cursor cursor = cr.query(Locations.CONTENT_URI, null, null, null, null);
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            String guid = cursor.getString(cursor.getColumnIndex(Locations.GUID));
            Intent i = new Intent();
            i.putExtra(IntentFilters.LOCATION.getIntent(), guid);
            setActivityIntent(i);
        }
    }
}

但是,我在getActivity()方法上得到了nullpointerexception,而且我似乎无法将此setActivityIntent放在其他地方。

2 个答案:

答案 0 :(得分:0)

这一切都应该在测试的setup()方法中完成,而不是在它的构造函数中完成。测试的构造者是无用的,应该保持不变。

答案 1 :(得分:0)

可以做到,但有点乱。基本上从我想要的数据库中获取了guid,为原始测试类创建了一个新的意图,将guid附加到intent上,然后启动了intent。

public void setUp() throws Exception {
     super.setUp(); 

    solo = new Solo(getInstrumentation(), getActivity());

    activity = getActivity();

    UsefulFunctions.insertDummyData(getActivity());

    ContentResolver cr = getActivity().getContentResolver();
    Cursor cursor = cr.query(Locations.CONTENT_URI, null, null, null, null);

    if (cursor != null) {
        if (cursor.moveToFirst()) {
            guid = cursor.getString(cursor.getColumnIndex(Locations.GUID));

        }
    }

    solo.goBack(); 

    Intent i = new Intent(activity.getApplicationContext(), InspectionListActivity.class);
    i.putExtra(IntentFilters.LOCATION.getIntent(), guid);
    setActivityIntent(i);
    activity.startActivity(i); 


}

在某种程度上,我可以更容易地从我的第一个列表开始,然后让Robotium在列表中“点击”一直到我想要的屏幕,即

solo.clickInList(0);

// Locations
solo.clickInList(0);

ListView ls = solo.getCurrentListViews().get(0);

solo.waitForActivity("InspectionListActivity");