Как проверить JUnit ContentResolver.notifyChange

Я пишу тесты для 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()); С тем же результатом.

Что я здесь делаю неправильно?

Solutions Collecting From Web of "Как проверить JUnit ContentResolver.notifyChange"

ProviderTestCase2 использует MockContentResolver . Проверка исходного кода, метод notifyChange ничего не делает.

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

Ваш scenerio не может быть протестирован с помощью ProviderTestCase2 . Взгляните на ProviderTestCase3 , но он использует частные пакеты android.

Изменить: я создал библиотеку, состоящую из нового класса ProviderTestCase3 в качестве замены ProviderTestCase2 которая вызывает вызовы ContentResolver.notifyChanged для наблюдателей, зарегистрированных в ProviderTestCase3.registerContentObserver . Вы можете использовать его для проверки уведомлений об изменениях. 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> .

Я использую Robolectric для unittest, насколько могу, без запуска эмулятора. Я подтвердил, что вы вызываете обновление в contentResolver следующим образом:

 ShadowContentResolver contentResolver = Robolectric.shadowOf( service.getContentResolver()); final List<NotifiedUri> notifiedUris = contentResolver.getNotifiedUris(); assertThat(notifiedUris.get(0).uri, is(uriToVerify));