如何JUnit测试ContentResolver.notifyChange

时间:2012-07-14 08:06:19

标签: android android-contentresolver android-testing

我正在编写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());同样的结果。

我在这里做错了什么?

2 个答案:

答案 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));