8

我正在为 a 编写测试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());过相同的结果。

我在这里做错了什么?

4

2 回答 2

4

ProviderTestCase2使用MockContentResolver. 检查源代码,它的notifyChange方法什么也没做。

@Override
public void notifyChange(Uri uri, ContentObserver observer, boolean syncToNetwork) {
}

你的场景不能用ProviderTestCase2. 看看ProviderTestCase3,但它使用 android 私有包。

编辑:我制作了一个由新ProviderTestCase3类组成的库作为替代,它保持对注册的观察者的内部ProviderTestCase2调用。您可以使用它来测试通知更改。 https://github.com/biegleux/TestsUtilsContentResolver.notifyChangedProviderTestCase3.registerContentObserver

用法:

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>

于 2012-07-14T09:59:27.657 回答
4

我在不运行模拟器的情况下尽可能多地使用Robolectric进行单元测试。我验证了调用 contentResolver 的更新,如下所示:

ShadowContentResolver contentResolver = Robolectric.shadowOf(
    service.getContentResolver());
final List<NotifiedUri> notifiedUris = contentResolver.getNotifiedUris();
assertThat(notifiedUris.get(0).uri, is(uriToVerify));
于 2013-01-18T21:30:11.017 回答