Wie Content-Provider auf Android testen
-
06-07-2019 - |
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
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 istAndere 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.