8

私はのテストを書いています、ContentProviderinsertは変更について通知しています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

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 に答える
4

ProviderTestCase2を使用しMockContentResolverます。ソースコードを確認すると、notifyChangeメソッドは何もしません。

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

あなたのシナリオは でテストできませんProviderTestCase2ProviderTestCase3を見てください。ただし、Android のプライベート パッケージを使用しています。

編集:に登録されたオブザーバーへの内部への呼び出しを保持ProviderTestCase3する の代わりに、新しいクラスで構成されるライブラリを作成しました。これを使用して、通知の変更をテストできます。 https://github.com/biegleux/TestsUtilsProviderTestCase2ContentResolver.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 に答える