Question

J'essaie de tester ma base de données avec ProviderTestCase2<T>. Je peux voir la base de données de test en cours de création. En tant que tel, je suppose que le fournisseur de contenu testé doit utiliser la base de données de test. Mais dès que j'essaie d'appeler le MockContentResolver (ou celui créé avec newResolverWithContentProviderFromSql), je reçois un UnsupportedOperationException. Ceci est documenté pour le comportement normal de MockContentResolver. En tant que tel, je suis un peu incertain quant à l'objectif de ProviderTestCase2.

Comment testez-vous vos fournisseurs de contenu?

Merci

Était-ce utile?

La solution

Étendez ProviderTestCase2 pour substituer getMockContentResolver () et renvoyer votre propre classe dérivée de MockContentResolver.

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

MyMockContentResolver devra remplacer les méthodes que vous souhaitez tester dans votre fournisseur de contenu.

Vous devriez alors pouvoir exécuter tous les tests de votre choix sur votre fournisseur de contenu alors que celui-ci est isolé par ProviderTestCase2

Autres conseils

Autant que je sache, configurer le résolveur de contenu fictif n’est pas explicitement nécessaire - je pourrais superviser les cas dans lesquels il se trouve (résolution correcte du fournisseur via l’URI, les éléments nécessitant le travail de corect getType ()), mais pour moi , il suffisait de faire quelque chose comme ça:

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

J'ajoute cette entrée car je pense que cela peut aider les programmeurs qui souhaitent tester leur fournisseur de contenu.

Imaginez que votre fournisseur de contenu s'appelle MyProvider et que vous disposiez d'une classe de contrat appelée MyProviderContract définissant certaines constantes.

Tout d'abord, vous allez écrire une classe de test appelée MyProviderTestCase qui hérite de ProviderTestCase2<MyProvider>. Vous devrez définir un constructeur qui appellera le super constructeur:

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

Ensuite, au lieu d'utiliser directement votre fournisseur (évitez d'utiliser getProvider() car les utilisateurs de votre fournisseur de contenu n'y accéderont pas directement), utilisez getMockContentResolver() pour obtenir une référence à un résolveur de contenu, puis appelez les méthodes de ce résolveur de contenu (query, insert, etc.). Dans le code suivant, je montre comment tester la <=> méthode.

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

Vous pouvez ensuite ajouter autant de méthodes de test que vous le souhaitez, en utilisant directement un résolveur de contenu au lieu de votre fournisseur de contenu, comme le feraient les utilisateurs de votre fournisseur de contenu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top