2009-08-01 3 views
10

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

Как вы тестируете поставщиков контента?

Благодаря

ответ

3

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

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

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

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

13

Насколько я нашел, создание фиктивного контента распознаватель явно не нужно - я мог бы наблюдать за случаи, когда это (возможно, правильно разрешения провайдера через URI, Hings, которые нуждаются в 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); 
     } 
    } 
} 
+0

В классе ProviderTestCase2 кода в коде не достаточно. Это очень полезно. – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

+1

В [Документация для Android] (http://developer.android.com/tools/testing/contentprovider_testing.html#WhatToTest) они рекомендуют не использовать напрямую контент-провайдера и вместо этого передавать контент-разрешение. Просто прочитайте мой пост, чтобы увидеть более подходящий пример тестирования поставщика контента. – eternay

6

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

Представьте, что ваш контент-провайдер называется 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); 
} 

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

+1

Как вам запустить ProviderTestCase? Вариант сборки тестового блока Android или контрольно-измерительный тест? – MRodrigues

Смежные вопросы