11

を使用して DB をテストしようとしていProviderTestCase2<T>ます。テスト DB が作成されていることがわかります。そのため、テスト済みのコンテンツ プロバイダーはテスト用 DB を使用する必要があると思います。MockContentResolverしかし、 (またはで作成されたもの)に対して呼び出しを試みるとすぐにnewResolverWithContentProviderFromSqlUnsupportedOperationException. これは、MockContentResolver の通常の動作として文書化されています。そのため、ProviderTestCase2 の目的が少しわかりません。

コンテンツ プロバイダーをどのようにテストしますか?

ありがとう

4

4 に答える 4

13

私が見つけた限りでは、モック コンテンツ リゾルバーを設定することは明示的に必要ではありません。(URI を介したプロバイダーの正しい解決、corect getType() の動作が必要なヒンジ) を監視するかもしれませんが、私にとっては、それはこのようなことをするのに十分です:

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);
        }
    }
}
于 2011-03-22T10:50:53.253 に答える
6

コンテンツ プロバイダーをテストしたいプログラマーに役立つと思うので、このエントリを追加します。

コンテンツ プロバイダーが MyProvider と呼ばれ、いくつかの定数を定義する MyProviderContract というコントラクト クラスがあるとします。

まず、MyProviderTestCaseを継承するというテスト クラスを作成しますProviderTestCase2<MyProvider>。コンストラクターを呼び出すコンストラクターを定義する必要がありますsuper

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

次に、プロバイダーを直接使用する代わりに (getProvider()コンテンツ プロバイダーのユーザーが直接アクセスしないため使用しないでください)、 を使用しgetMockContentResolver()てコンテンツ リゾルバーへの参照を取得し、このコンテンツ リゾルバーのメソッド ( 、 など) を呼び出しqueryますinsert。 . 次のコードでは、メソッドをテストする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);
}

次に、コンテンツ プロバイダーのユーザーと同様に、コンテンツ プロバイダーの代わりにコンテンツ リゾルバーを直接使用して、必要な数のテスト メソッドを追加できます。

于 2013-03-06T13:26:55.190 に答える
3

ProviderTestCase2を拡張してgetMockContentResolver()をオーバーライドし、MockContentResolverから派生した独自のクラスを返します。

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

MyMockContentResolverは、ContentProviderでテストするすべてのメソッドをオーバーライドする必要があります。

そうすれば、ProviderTestCase2によって分離されている間に、コンテンツプロバイダーで必要なテストを実行できるはずです。

于 2009-08-22T23:57:06.427 に答える