2009-08-01 35 views
10

我想用ProviderTestCase2<T>來測試我的數據庫。我可以看到正在創建測試數據庫。就我看來,測試內容提供商應該使用測試數據庫。但只要我嘗試對MockContentResolver(或使用newResolverWithContentProviderFromSql創建的那個)撥打電話,我就會收到UnsupportedOperationException。這是作爲正常行爲記錄在MockContentResolver。因此,我對ProviderTestCase2的目的有點不確定。如何在Android上測試內容提供商

你如何測試你的內容提供者?

感謝

回答

3

擴展ProviderTestCase2覆蓋getMockContentResolver(),並返回從MockContentResolver派生自己的類。

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 2012-07-06 04:51:04

+1

在[Android文檔](http://developer.android.com/tools/testing/contentprovider_testing.html#WhatToTest)中,他們建議不要直接使用您的內容提供程序,而要通過內容解析程序。請閱讀我的帖子,以查看如何測試內容提供者的更充分示例。 – eternay 2013-03-06 13:31:19

6

我添加此項,因爲我認爲它可以幫助想要測試其內容提供者的程序員。

想象一下你的Content Provider被稱爲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); 
} 

然後,只要你想,你可以添加儘可能多的測試方法,使用內容解析,而不是直接在內容提供商,因爲會做你的內容提供商的用戶。