Как проверить контент-провайдеров на Android - PullRequest
11 голосов
/ 01 августа 2009

Я пытаюсь проверить свою БД, используя ProviderTestCase2<T>. Я вижу, как создается тестовая БД. Поэтому я полагаю, что проверенный поставщик контента должен использовать тестовую БД. Но как только я пытаюсь выполнить любые вызовы против MockContentResolver (или звонка, созданного с помощью newResolverWithContentProviderFromSql), я получаю UnsupportedOperationException. Это задокументировано для MockContentResolver как нормальное поведение. В связи с этим я немного не уверен относительно цели ProviderTestCase2.

Как вы тестируете контент-провайдеров?

Спасибо

Ответы [ 3 ]

13 голосов
/ 22 марта 2011

Насколько я обнаружил, настройка распознавателя фиктивного контента не является явной необходимостью - я мог бы наблюдать за случаями, когда это (возможно, правильное разрешение провайдера через URI, подсказки, для которых должен работать corect getType ()), но для меня Этого было достаточно, чтобы сделать что-то вроде этого:

package org.droidcon.apps.template.provider.test;

import org.droidcon.apps.template.provider.ProfileContract;
import org.droidcon.apps.template.provider.ProfileProvider;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.test.ProviderTestCase2;

public class ProfileProviderTest extends ProviderTestCase2<ProfileProvider> {

    public ProfileProviderTest() {
        super(ProfileProvider.class, ProfileProvider.class.getName());
    }

    protected void setUp() throws Exception {
        super.setUp();
    }


    /**
     * Very basic query test.
     * 
     * Prerequisites: 
     * <ul>
     * <li>A provider set up by the test framework
     * </ul>
     * 
     * Expectations: 
     * <ul>
     * <li> a simple query without any parameters, before any inserts returns a 
     * non-null cursor
     * <li> a wrong uri results in {@link IllegalArgumentException}
     * </ul>
     */
    public void testQuery(){
        ContentProvider provider = getProvider();

        Uri uri = ProfileContract.CONTENT_URI;

        Cursor cursor = provider.query(uri, null, null, null, null);

        assertNotNull(cursor);

        cursor = null;
        try {
            cursor = provider.query(Uri.parse("definitelywrong"), null, null, null, null);
            // we're wrong if we get until here!
            fail();
        } catch (IllegalArgumentException e) {
            assertTrue(true);
        }
    }
}
6 голосов
/ 06 марта 2013

Я добавляю эту запись, так как думаю, что она может помочь программистам, которые хотят протестировать свой контент-провайдер.

Представьте, что ваш контент-провайдер называется MyProvider и что у вас есть класс контракта MyProviderContract, определяющий некоторые константы.

Прежде всего, вы напишите тестовый класс с именем MyProviderTestCase, который наследуется от ProviderTestCase2<MyProvider>. Вам нужно определить конструктор, который будет вызывать конструктор super:

public MyProviderTestCase() {
    super(MyProvider.class, MyProviderContract.AUTHORITY);
}

Затем, вместо непосредственного использования вашего провайдера (избегайте использования getProvider(), поскольку пользователи вашего провайдера контента не будут обращаться к нему напрямую), используйте getMockContentResolver(), чтобы получить ссылку на решатель контента, а затем вызовите методы этот преобразователь контента (query, insert и т. д.). В следующем коде я покажу, как проверить метод insert.

public void testInsert() {
    Uri uri = MyProviderContract.CONTENT_URI;
    ContentValues values = new ContentValues();
    values.put(MyProviderContract.FIELD1, "value 1");
    values.put(MyProviderContract.FIELD2, "value 2");
    Uri resultingUri = getMockContentResolver().insert(uri, values);
    // Then you can test the correct execution of your insert:
    assertNotNull(resultingUri);
    long id = ContentUris.parseId(resultingUri);
    assertTrue(id > 0);
}

Затем вы можете добавить столько методов тестирования, сколько захотите, используя распознаватель контента вместо поставщика контента напрямую, как это сделали бы пользователи вашего контент-провайдера.

3 голосов
/ 23 августа 2009

Расширьте ProviderTestCase2, чтобы переопределить getMockContentResolver () и вернуть свой собственный класс, производный от MockContentResolver.

public class MyProviderTestCase2 extends ProviderTestCase2 {
    @Override
    public MockContentResolver getMockContentResolver () {
        return new MyMockContentResolver();
    }
}

MyMockContentResolver потребуется переопределить любые методы, которые вы хотите проверить в вашем ContentProvider.

Тогда вы сможете запускать любые тесты, которые вы хотите, на вашем контент-провайдере, пока он изолирован ProviderTestCase2

...