2009-08-01 15 views
10

Próbuję przetestować mój DB przy użyciu ProviderTestCase2<T>. Widzę, że tworzony jest testowy DB. Jak sądzę, przetestowany dostawca treści powinien użyć testu DB. Ale tak szybko, jak próbuję żadnych połączeń z MockContentResolver (lub ten utworzony z newResolverWithContentProviderFromSql), otrzymuję UnsupportedOperationException. Jest to udokumentowane dla MockContentResolver jako normalne zachowanie. Jako takie jestem nieco pewien celu ProviderTestCase2.Jak testować dostawców zawartości na Androidzie

Jak testujesz dostawców treści?

Dzięki

Odpowiedz

3

Extend ProviderTestCase2 przesłonić getMockContentResolver() i powrócić własną klasę pochodzącą z MockContentResolver.

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

MyMockContentResolver będzie musiał zastąpić wszelkie metody, które chcesz przetestować w swoim dostawcy treści.

Następnie powinieneś być w stanie uruchomić wszystkie testy, które mają na swoim dostawcy treści, podczas gdy samodzielnie przez ProviderTestCase2

13

O ile znalazłem, konfigurowania mock treści rozpoznawania nazw nie jest wyraźnie konieczne - może ja nadzorować przypadki, w których to (być może poprawne rozwiązanie dostawcy poprzez URI, hings które potrzebują corect GetType() pracujących), ale dla mnie, to wystarczyło, aby zrobić coś takiego:

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

Nie ma zbyt wiele przykładowego kodu na stronie ProviderTestCase2 w Internecie. To jest bardzo pomocne. – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

+1

W [Dokumentacja Androida] (http://developer.android.com/tools/testing/contentprovider_testing.html#WhatToTest) zalecają, aby nie używać bezpośrednio dostawcy zawartości i zamiast tego przechodzić przez program do rozpoznawania zawartości. Po prostu przeczytaj mój post, aby zobaczyć bardziej odpowiedni przykład, jak przetestować dostawcę treści. – eternay

6

dodać ten wpis, jak myślę, to może pomóc programistom, którzy chcą przetestować dostawcę treści.

Wyobraź sobie, że Twój dostawca treści nazywa się MyProvider i posiadasz klasę kontraktu o nazwie MyProviderContract definiującą pewne stałe.

Przede wszystkim napiszesz klasę testową o nazwie MyProviderTestCase, która dziedziczy po ProviderTestCase2<MyProvider>. Musisz określić konstruktor, który wywoła konstruktor super:

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

Wtedy, zamiast korzystać bezpośrednio z dostawcą (unikać getProvider() jak użytkownicy dostawcy zawartości nie będzie do niego dostęp bezpośrednio), użyj getMockContentResolver() w celu uzyskania odwołania do narzędzia do rozpoznawania zawartości, a następnie wywołania metod tego narzędzia do rozpoznawania zawartości (query, insert itd.). W poniższym kodzie pokazuję, jak przetestować metodę 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); 
} 

Następnie można dodać dowolną liczbę metod badawczych, jak chcesz, używając zawartości rozpoznawania nazw zamiast dostawcy treści bezpośrednio, jak zrobiłby użytkownikom dostawcy treści.

+1

Jak uruchomić ProviderTestCase? Wariant wersji testowej urządzenia z Androidem lub test oprzyrządowania? – MRodrigues