【发布时间】:2014-12-12 17:35:15
【问题描述】:
我有以下几行代码:-
public class ReminderBroadcastReceiver extends BroadcastReceiver {
private static final String TAG = "ReminderBroadcastReceiver";
public static final String EVENT_REMINDER_ACTION = "android.intent.action.EVENT_REMINDER";
private Context mcontext;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
mcontext = context;
String action = intent.getAction();
Log.i(TAG, "reminder broadcast received ");
if (action.equals(EVENT_REMINDER_ACTION)) {
processReminder(intent);
}
}
private void processReminder(Intent intent) {
Uri uri = intent.getData();
ContentResolver cr = mcontext.getContentResolver();
String alarmTime = uri.getLastPathSegment();
String[] projection = new String[] { CalendarAlerts.EVENT_ID,
CalendarAlerts.DESCRIPTION, CalendarAlerts.TITLE,
CalendarAlerts.ALARM_TIME };
String selection = CalendarContract.CalendarAlerts.ALARM_TIME + "=?";
Cursor c = cr.query(
CalendarContract.CalendarAlerts.CONTENT_URI_BY_INSTANCE,
projection, selection, new String[] { alarmTime }, null);
ReminderData reminder_data = null;
if (c != null) {
if (c.moveToFirst()) {
do {
String event_id = c.getString(c
.getColumnIndex(CalendarAlerts.EVENT_ID));
String event_desc = c.getString(c
.getColumnIndex(CalendarAlerts.DESCRIPTION));
String event_title = c.getString(c
.getColumnIndex(CalendarAlerts.TITLE));
long alarm_time = c.getLong(c
.getColumnIndex(CalendarAlerts.ALARM_TIME));
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm",
Locale.getDefault());
String str_alarm_time = sdf.format(new Date(alarm_time));
reminder_data = new ReminderData(event_id,event_desc,event_title,str_alarm_time);
} while (c.moveToNext());
}
c.close();
}
sendReminder(NotificationType.NOTI_ALARM, 0, reminder_data);
}
private void sendReminder(int notiType, int arg1, ReminderData data) {
Message msg = new Message();
msg.what = notiType;
msg.arg1 = arg1;
msg.obj = data;
NotificationQueueManager.getInstance(mcontext).queueNotification(msg);
}
}
我想对上述类进行 J UNit 测试,但 (c.moveToFirst()) 总是返回 false。 我怎样才能让它返回true,以便它进入块内。
我的测试代码如下:-
public void testtestonReceive4(){
ContentValues values = new ContentValues();
values.put(CalendarAlerts.EVENT_ID, "1");
values.put(CalendarAlerts.DESCRIPTION, "2");
values.put(CalendarAlerts.TITLE, "3");
values.put(CalendarAlerts.ALARM_TIME, "4");
ContentResolver cr = mContext.getContentResolver();
cr.insert(CalendarContract.CalendarAlerts.CONTENT_URI_BY_INSTANCE, values);
...
...
}
我的测试代码 Android 清单:-
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.app"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="16" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />
<instrumentation
android:name="android.test.InstrumentationTestRunner"
android:targetPackage="com.test.app" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<uses-library android:name="android.test.runner" />
</application>
</manifest>
我收到错误:-
java.lang.SecurityException: Permission Denial: 从 pid=18317 写入 com.android.providers.calendar.CalendarProvider2 uri content://com.android.calendar/calendar_alerts/by_instance,uid=10017 需要 android。 permission.WRITE_CALENDAR 或 grantUriPermission()
【问题讨论】:
-
当它返回false时,说明你的查询结果是一个空集。
-
是的,但我想对该类进行 J 单元测试。可以,我将它设置为从我的测试代码中返回 true。
-
游标中必须有数据,否则调用
moveToFirst时会返回false。如果您希望该方法返回true,则应将一些数据放入您的ContentResolver -
如何使用我的测试代码向其中填充数据?使其返回 true。
-
使用
ContentValues将数据插入到您的ContentResolver
标签: android junit android-cursor android-contentresolver