Androidでコンテンツプロバイダーをテストする方法
-
06-07-2019 - |
質問
ProviderTestCase2<T>
を使用してDBをテストしようとしています。テストDBが作成されているのがわかります。そのため、テスト対象のコンテンツプロバイダーはテストDBを使用する必要があります。しかし、MockContentResolver
(またはnewResolverWithContentProviderFromSql
で作成されたもの)に対して呼び出しを試みるとすぐにUnsupportedOperationException
が返されます。これは、MockContentResolverの通常の動作として文書化されています。そのため、ProviderTestCase2の目的について少し確信がありません。
コンテンツプロバイダーをどのようにテストしますか?
ありがとう
解決
ProviderTestCase2を拡張してgetMockContentResolver()をオーバーライドし、MockContentResolverから派生した独自のクラスを返します。
public class MyProviderTestCase2 extends ProviderTestCase2 {
@Override
public MockContentResolver getMockContentResolver () {
return new MyMockContentResolver();
}
}
MyMockContentResolverは、ContentProviderでテストするメソッドをオーバーライドする必要があります。
その後、ProviderTestCase2によって隔離されている間にコンテンツプロバイダーで必要なテストを実行できるはずです
他のヒント
私が見つけた限りでは、モックコンテンツリゾルバの設定は明示的に必要ではありません-それが存在する場合を監視するかもしれません、次のようなことで十分でした:
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);
}
}
}
このエントリを追加するのは、コンテンツプロバイダをテストしたいプログラマを支援できると思うからです。
コンテンツプロバイダーの名前がMyProviderであり、定数を定義するMyProviderContractというコントラクトクラスがあることを想像してください。
まず、MyProviderTestCase
を継承するProviderTestCase2<MyProvider>
というテストクラスを記述します。 super
コンストラクターを呼び出すコンストラクターを定義する必要があります。
public MyProviderTestCase() {
super(MyProvider.class, MyProviderContract.AUTHORITY);
}
次に、プロバイダーを直接使用する代わりに(コンテンツプロバイダーのユーザーが直接アクセスしないのでgetProvider()
を使用しないでください)、getMockContentResolver()
を使用してコンテンツリゾルバーへの参照を取得し、次のメソッドを呼び出しますこのコンテンツリゾルバー(query
、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);
}
その後、コンテンツプロバイダーのユーザーのように、コンテンツプロバイダーの代わりにコンテンツリゾルバーを使用して、必要な数のテストメソッドを追加できます。