Как я могу протестировать метод, который использует ContentProvider с тестовыми данными? - PullRequest
0 голосов
/ 20 октября 2018

Я реализовал и протестировал ContentProvider (используя ProviderTestCase2) с именем NumbersProvider.Это работает как шарм.

Теперь я хочу сделать еще один шаг и протестировать следующий метод, который использует ContentProvider (внутри класса с именем DatabaseUtils), чтобы выбрать Box из LinkedList блоковс номером, ближайшим к данному номеру:

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?).Не уверен, как это настроить, чтобы метод использовал мои тестовые данные.

Я думал о следующей строке (часть класса AndroidTest, расширяющего ProviderTestCase2).

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...