Я реализовал и протестировал 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);
}