我正在编写ContentProvider
的测试,insert
我正在通知getContext().getContentResolver().notifyChange(mUri, null);
我的测试类扩展了ProviderTestCase2
。我创建了以下模拟ContentObserver类:
private class ContentObserverMock extends ContentObserver {
public boolean changed = false;
public ContentObserverMock(Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
}
@Override
public void onChange(boolean selfChange) {
changed = true;
}
@Override
public boolean deliverSelfNotifications() {
return true;
}
}
这是测试用例:
public void testInsertNotifyContentChanges() {
ContentResolver resolver = mContext.getContentResolver();
ContentObserverMock co = new ContentObserverMock(null);
resolver.registerContentObserver(CONTENT_URI, true, co);
ContentValues values = new ContentValues();
values.put(COLUMN_TAG_ID, 1);
values.put(COLUMN_TAG_CONTENT, "TEST");
resolver.insert(CONTENT_URI, values);
assertTrue(co.changed);
}
似乎永远不会调用onChange
,我也尝试ContentObserverMock co = new ContentObserverMock(new Handler());
同样的结果。
我在这里做错了什么?
答案 0 :(得分:4)
ProviderTestCase2
使用MockContentResolver
。检查源代码时,notifyChange
方法无效。
@Override
public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) {
}
无法使用ProviderTestCase2
测试您的场景。看一下ProviderTestCase3,但它使用了android私有包。
编辑:我创建了一个由新ProviderTestCase3
类组成的库,作为ProviderTestCase2
的替代,可以将ContentResolver.notifyChanged
内部的调用内容保存到ProviderTestCase3.registerContentObserver
{1}}。您可以使用它来测试通知更改。
https://github.com/biegleux/TestsUtils
用法:
public void testInsertNotifyContentChanges() {
ContentObserverMock observer = new ContentObserverMock(new Handler());
registerContentObserver(CONTENT_URI, true, observer);
ContentValues values = new ContentValues();
values.put(COLUMN_TAG_ID, 1);
values.put(COLUMN_TAG_CONTENT, "TEST");
getMockContentResolver().insert(CONTENT_URI, values);
assertTrue(observer.mChanged);
}
不要忘记extends ProviderTestCase3<YourProvider>
。
答案 1 :(得分:4)
我尽可能使用Robolectric进行单元测试,而无需运行模拟器。我验证了如下调用contentResolver的更新:
ShadowContentResolver contentResolver = Robolectric.shadowOf(
service.getContentResolver());
final List<NotifiedUri> notifiedUris = contentResolver.getNotifiedUris();
assertThat(notifiedUris.get(0).uri, is(uriToVerify));