我已经实现并测试了名为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);
}