2009-08-01 18 views
10

Sto provando a testare il mio DB utilizzando ProviderTestCase2<T>. Posso vedere il DB di test che viene creato. Come tale suppongo, il fornitore di contenuti testato dovrebbe utilizzare il DB di test. Ma non appena proverò a chiamare lo MockContentResolver (o quello creato con newResolverWithContentProviderFromSql), ricevo un UnsupportedOperationException. Questo è documentato per MockContentResolver come comportamento normale. In quanto tale, sono un po 'insicuro sullo scopo del ProviderTestCase2.Come testare i provider di contenuti su Android

Come testare i fornitori di contenuti?

Grazie

risposta

3

Estendere ProviderTestCase2 ignorare getMockContentResolver() e restituire la propria classe derivata da MockContentResolver.

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

MyMockContentResolver sarà necessario eseguire l'override tutti i metodi che si desidera testare nel vostro ContentProvider.

Poi si dovrebbe essere in grado di eseguire qualsiasi test che si desidera sul vostro fornitore di contenuti mentre è isolato da ProviderTestCase2

13

Per quanto ho trovato, l'istituzione del content resolver finto non è esplicitamente necessaria - potrei supervisionare casi in cui è (forse corretto di risoluzione del fornitore tramite URI, hings che necessitano getType corect() di lavoro), ma per me, è stato sufficiente per fare qualcosa di simile:

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

Non c'è molto codice di esempio sulla classe ProviderTestCase2 su Internet. Questo è molto utile. – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

+1

In [Documentazione Android] (http://developer.android.com/tools/testing/contentprovider_testing.html#WhatToTest), consigliano di non utilizzare direttamente il fornitore di contenuti e di passare invece a un risolutore di contenuti. Basta leggere il mio post per vedere un esempio più adeguato di come testare un fornitore di contenuti. – eternay

6

aggiungo questa voce come penso che può aiutare i programmatori che vogliono testare il proprio fornitore di contenuti.

Immaginate che il vostro fornitore di contenuti sia chiamato MyProvider e che abbiate una classe di contratto chiamata MyProviderContract che definisce alcune costanti.

Prima di tutto, si scriverà una classe di test denominata MyProviderTestCase che eredita da ProviderTestCase2<MyProvider>. Dovrete definire un costruttore che chiamerà il super costruttore:

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

Poi, invece di utilizzare direttamente il vostro fornitore (evitare l'uso di getProvider() come utenti del fornitore di contenuti non accedervi direttamente), utilizzare il getMockContentResolver() per ottenere un riferimento a un resolver di contenuto e quindi chiamare i metodi di questo risolutore di contenuto (query, insert, ecc.). Nel seguente codice, indico come testare il metodo 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); 
} 

Quindi è possibile aggiungere il numero di metodi di prova come si vuole, utilizzando un risolutore di contenuti al posto del tuo fornitore di contenuti direttamente, come farebbe utenti di un fornitore di contenuti.

+1

Come si esegue ProviderTestCase? Variante build test unità Android o Test strumentazione? – MRodrigues

Problemi correlati