ContentObserver никогда не получает обратный вызов onChange во время тестирования инструментов? - PullRequest
0 голосов
/ 15 февраля 2011

во время написания тестов для моего контент-провайдера я наткнулся на странную проблему.Следующий код просто пытается проверить вызов на моем ContentObserver при изменении базовых данных.Но обратный вызов onChange ContentObserverMock никогда не вызывается.Это также не имеет значения, если я попробую это прямо на ContentResolver или курсоре.Вот мой тест:

public class TestCursor extends AndroidTestCase {

    private class ContentObserverMock extends ContentObserver {

        public boolean  cursorObserverIsTriggered   = false;


        /**
         * @param handler
         */
        public ContentObserverMock(Handler handler) {
            super(handler);
        }


        @Override
        public boolean deliverSelfNotifications() {
            return true;
        }


        /**
         * {@inheritDoc}
         */
        @Override
        public void onChange(boolean selfChange) {
            Log.d(TestCursor.TAG, "ONCHANGE is called");
            cursorObserverIsTriggered = true;
            super.onChange(selfChange);
        }
    }

    private final static String TAG = TestCursor.class.getSimpleName();


    /**
     * {@inheritDoc}
     */
    @Override
    protected void setUp() throws Exception {
        super.setUp();
        Globals.setApplicationContext(getContext());
        DummyDataDB.insertDummyDataIntoDB();
    }


    /**
     * {@inheritDoc}
     */
    @Override
    protected void tearDown() throws Exception {
        super.tearDown();
        DummyDataDB.clearDB();
    }


    @SmallTest
    public void testContentResolver() {

        ContentResolver resolver = getContext().getContentResolver();

        Uri uri = MyContentProvider.CONTENT_URI;

        Handler handler = new Handler();
        ContentObserverMock contentObserver = new ContentObserverMock(handler);

        resolver.registerContentObserver(uri, true, contentObserver);

        Cursor cursor = resolver.query(uri, null, null, null, null);
        Assert.assertNotNull(cursor);
        int count = cursor.getCount();

        DomainObject contentStub = StubFactory.createContentStub();
        ContentValues cv = HelperDomainObjectToContentValues.contentValuesFor(contentStub );

        resolver.insert(uri, cv);
        cursor = resolver.query(uri, null, null, null, null);

        Assert.assertEquals(count, (cursor.getCount() - 1));
        Assert.assertEquals(true, contentObserver.cursorObserverIsTriggered);
    }


    @SmallTest
    public void testCursor() {

        Log.d(TestCursor.TAG, "testCursor()");
        DbHelper dbHelper = new DbHelper(getContext());
        Cursor cursor = dbHelper.selectAllDomainObjects();

        Handler handler = new Handler();

        ContentObserverMock contentObserver = new ContentObserverMock(handler);
        Log.d(TestCursor.TAG, "registerContentObserver()");
        cursor.registerContentObserver(contentObserver);

        DomainObject contentStub = StubFactory.createContentStub();
        ContentValues cv = HelperDomainObjectToContentValues.contentValuesFor(contentStub );
        dbHelper.writeDOmainObject(contentValues);
        Log.d(TestCursor.TAG, "cursor Requery()");
        cursor.requery();

        Assert.assertEquals(true, contentObserver.cursorObserverIsTriggered);
    }

Заранее спасибо!

1 Ответ

1 голос
/ 26 февраля 2011

Я решил проблему с использованием средства доступа в своей деятельности, чтобы получить ссылку на обработчик. С определенным обработчиком ContentObserver получает обратный вызов, как и ожидалось ...

...