如何测试将ContentProvider与测试数据一起使用的方法?

时间:2018-10-20 13:00:47

标签: java android integration-testing android-contentprovider android-testing

我已经实现并测试了名为ProviderTestCase2的ContentProvider(使用NumbersProvider)。就像魅力一样。

现在,我想更进一步,并测试以下使用ContentProvider的方法(在名为DatabaseUtils的类中)从带有数字的框的LinkedList中选择Box最接近给定数字:

public static Box selectBox(Context context, int number) {
    Box toReturn = new Box();
    LinkedList<Box> boxes = queryAllBoxes(context);
    int difference = 999999;
    for (Box box: boxes) {
        if (Math.abs(box.getNumber() - number) < difference) {
            toReturn = box;
            difference = Math.abs(toReturn.getNumber() - number);
        }
    }
    return toReturn;
}

代码调用queryAllBoxes,如下所示:

public static LinkedList<Box> queryAllBoxes(Context context) {
    String[] projection = {NumbersContract.Table.KEY_NUMBERS};
    Cursor cursor = context.getContentResolver().query(NumbersContract.Table.BASE_CONTENT_URI_BOXES, projection, null, null, null, null);
    LinkedList<Box> boxes = new LinkedList<>();
    if (cursor != null) {
        if (cursor.moveToFirst()) {
            int number = Integer.parseInt(cursor.getString(cursor.getColumnIndex(NumbersContract.Table.KEY_NUMBER)));
            String boxName = cursor.getString(cursor.getColumnIndex(NumbersContract.Table.KEY_BOXNAME));
            boxes.add(new Box(number, boxName));
        }
        while (cursor.moveToNext()) {
            int number = Integer.parseInt(cursor.getString(cursor.getColumnIndex(NumbersContract.Table.KEY_NUMBER)));
            String boxName = cursor.getString(cursor.getColumnIndex(NumbersContract.Table.KEY_BOXNAME));
            boxes.add(new Box(number, boxName));
            boxes.add(new Box(number, boxName));
        }
        cursor.close();
    }
    return boxes;
}

好的,因此在我的活动中使用以下方法调用了selectBox方法:

Box box = DatabaseUtils.selectBox(MainActivity.getContext());

问题是:如何使用测试数据测试此方法,类似于测试ContentProvider本身时所做的事情?

这是我到目前为止尝试过的:

我再次尝试使用ProviderTestCase2进行设置。但是,以某种方式,我还需要使用Context(或者也许是MockContext?)。不确定如何设置,以便该方法将使用我的testdata。

我在考虑以下内容(扩展ProviderTestCase2的AndroidTest类的一部分)。

public void testBoxSelection() {
    //Setup
    ContentProvider contentProvider = getProvider();        
    contentProvider.bulkInsert(NumbersContract.Table.BASE_CONTENT_URI_BOXES, multipleBoxes);  //multipleBoxes is a LinkedList of Boxes (my test data)

    //Test
    int number = 1;
    String boxName =  "BoxOne";
    Box selectedBox = DatabaseUtils.selectBox(???, number);
    assertEquals("testBoxSelection: correct box selected", selectedBox.getBoxName(), boxName);
}

0 个答案:

没有答案