Domanda

Sto provando a testare il mio DB usando ProviderTestCase2<T>. Vedo il DB di prova in fase di creazione. Pertanto, suppongo che il fornitore di contenuti testati dovrebbe utilizzare il DB di prova. Ma non appena provo qualsiasi chiamata con MockContentResolver (o quella creata con newResolverWithContentProviderFromSql), ricevo un UnsupportedOperationException. Questo è documentato per MockContentResolver come comportamento normale. Pertanto, non sono sicuro dello scopo di ProviderTestCase2.

Come testate i vostri fornitori di contenuti?

Grazie

È stato utile?

Soluzione

Estendi ProviderTestCase2 per sovrascrivere getMockContentResolver () e restituire la tua classe derivata da MockContentResolver.

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

MyMockContentResolver dovrà sostituire tutti i metodi che desideri testare nel tuo ContentProvider.

Quindi dovresti essere in grado di eseguire tutti i test desiderati sul tuo provider di contenuti mentre è isolato da ProviderTestCase2

Altri suggerimenti

Per quanto ho scoperto, l'impostazione del risolutore di contenuti fittizi non è esplicitamente necessaria - Potrei supervisionare i casi in cui si trova (forse la corretta risoluzione del provider tramite URI, che necessita di corect getType () funzionante), ma per me , è stato sufficiente fare qualcosa del genere:

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);
        }
    }
}

Aggiungo questa voce perché penso possa aiutare i programmatori che vogliono testare il proprio Content Provider.

Immagina che il tuo Content Provider si chiami MyProvider e che tu abbia una classe di contratto chiamata MyProviderContract che definisce alcune costanti.

Prima di tutto, scriverai una classe di test chiamata MyProviderTestCase che eredita da ProviderTestCase2<MyProvider>. Dovrai definire un costruttore che chiamerà super costruttore:

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

Quindi, invece di utilizzare direttamente il tuo provider (evita di usare getProvider() poiché gli utenti del tuo provider di contenuti non accederanno direttamente a lui), usa getMockContentResolver() per ottenere un riferimento a un risolutore di contenuti e poi chiama i metodi di questo risolutore di contenuti (query, insert, ecc.). Nel seguente codice, mostrerò come testare il metodo <=>.

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 puoi aggiungere tutti i metodi di test che desideri, utilizzando direttamente un risolutore di contenuti anziché il tuo fornitore di contenuti, come farebbero gli utenti del tuo fornitore di contenuti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top