2009-08-01 18 views
10

ProviderTestCase2<T>を使用して自分のDBをテストしようとしています。作成されたテストDBが表示されます。このように、テストされたコンテンツプロバイダはテストDBを使用する必要があります。しかし、MockContentResolver(またはnewResolverWithContentProviderFromSqlで作成されたもの)に対するコールを試みるとすぐに、私はUnsupportedOperationExceptionを取得します。これは、通常の動作としてMockContentResolverのために文書化されています。そのため、私はProviderTestCase2の目的について少し不明です。Androidでコンテンツプロバイダをテストする方法

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

おかげ

答えて

3

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

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

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

それは私の知る限りモックコンテンツリゾルバが明示的に必要ではない設定、見つかったとしてProviderTestCase2

13

により単離している間、あなたはあなたのコンテンツプロバイダーにしたい任意のテストを実行することができるはず - 私はどこのケースを監督かもしれませんそれは(多分URI、corectのgetTypeを(必要hings経由プロバイダの解決訂正)作業)ですが、私にとって、このような何かを行うのに十分だった。

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

インターネット上のProviderTestCase2クラスにサンプルコードはあまりありません。これは非常に役に立ちます。 – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

+1

[Androidのドキュメント](http://developer.android.com/tools/testing/contentprovider_testing.html#WhatToTest)では、コンテンツプロバイダを直接使用せず、代わりにコンテンツリゾルバを使用することをおすすめします。私の記事を読んで、コンテンツプロバイダのテスト方法のより適切な例を見てください。 – eternay

6

私はそれを考えると、私はこのエントリを追加しますコンテンツプロバイダーをテストしたいプログラマーを助けることができます。

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

まず、ProviderTestCase2<MyProvider>を継承するMyProviderTestCaseというテストクラスを作成します。その後

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

、直接ではなく、あなたのプロバイダを使用して(あなたのコンテンツプロバイダのユーザーが直接アクセスしないようgetProvider()の使用を避ける)、を使用:あなたはsuperコンストラクタを呼び出すコンストラクタを定義する必要がありますgetMockContentResolver()を使用してコンテンツリゾルバへの参照を取得し、このコンテンツリゾルバのメソッドを呼び出します(queryinsertなど)。次のコードでは、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); 
} 

あなたが望むようコンテンツプロバイダのユーザーを行うだろうと、あなたは、直接あなたの代わりに、コンテンツプロバイダのコンテンツリゾルバを使用して、できるだけ多くのテストメソッドを追加することができます。

+1

ProviderTestCaseの実行方法は? Androidユニットのテストビルドの変種または計測のテスト? – MRodrigues

関連する問題