Frage

Ich versuche, meine DB mit ProviderTestCase2<T> zu testen. Ich kann der Test DB wird erstellt sehen. Als solche nehme ich an, sollte der getesteten Content-Provider den Test DB verwenden. Aber sobald ich versuche, keine Anrufe gegen die MockContentResolver (oder das mit newResolverWithContentProviderFromSql erstellt), erhalte ich eine UnsupportedOperationException. Dies ist für die MockContentResolver als normales Verhalten dokumentiert. Als solche bin ich etwas unsicher auf den Zweck der ProviderTestCase2.

Wie testen Sie Ihre Content-Provider?

Danke

War es hilfreich?

Lösung

ProviderTestCase2 Extend getMockContentResolver () und das Rück Ihre eigene Klasse von MockContentResolver abgeleitet außer Kraft zu setzen.

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

MyMockContentResolver müssen alle Methoden außer Kraft setzen Sie in Ihrem Contentprovider testen möchten.

Dann sollten Sie in der Lage sein, alle Tests laufen auf dem Content-Provider wollen, während es durch ProviderTestCase2

isoliert ist

Andere Tipps

Soweit ich fand, ist die Schein Inhalt Resolver Einrichtung nicht explizit notwendig - ich könnte Fällen überwachen, wo es (vielleicht richtige Lösung des Anbieters über URI, hings die corect getType () arbeiten müssen), aber für mich es war genug, um so etwas zu tun:

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

Ich füge diesen Eintrag als ich denke, es Programmierer, die ihre Content-Provider testen möchten helfen können.

Stellen Sie sich Ihren Content Provider heißt MyProvider und dass Sie einen Vertrag Klasse haben MyProviderContract definieren einige Konstanten genannt.

Zunächst einmal werden Sie eine Test-Klasse namens MyProviderTestCase schreiben, die von ProviderTestCase2<MyProvider> erbt. Sie werden einen Konstruktor definieren, die den super Konstruktor rufen:

public MyProviderTestCase() {
    super(MyProvider.class, MyProviderContract.AUTHORITY);
}
Verwenden Sie die getProvider() einen Verweis auf einen Gehalt Resolver zu erhalten und rufen Sie dann die Methoden dieses Inhalts Resolver

Dann stattdessen direkt Ihren Provider zu verwenden (mit getMockContentResolver() als Benutzer Ihres Content-Provider wird es nicht direkt zugreifen vermeiden) ( query, insert, etc.). Im folgenden Code, zeige ich, wie die insert Methode zu testen.

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

Dann können Sie so viele Testmethoden hinzufügen, wie Sie wollen, direkt mit einem Gehalt Resolver anstelle Ihren Content-Provider verwenden, da die Benutzer des Content-Provider tun würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top