在這個組件的測試過程當中,咱們嘗試了兩種方式去獲取數據庫:html
一、被測程序對外提供的ContentProvider接口;java
二、經過Instrumentation的getTargetContext拿到的數據庫列表,而後自定義一個SQLiteOpenHelper的子類去完成數據庫的訪問。android
首先來講一下第一種方式的測試過程:數據庫
前提:要測試provider須要你知道被測程序提供出來的URI和AUTHORITY。windows
一、你須要新建一個測試類去繼承ProviderTestCase2類,而後在測試類的無參構造函數中調用父類的構造方法super(Class providerClass, String providerAuthority);(固然最好是得有被測應用的源碼,若是沒有你得知道前提和provider類完整的包名。)
eclipse
二、須要你重寫setup方法,在super.setup()後面開始寫(這句是必須,由於它會完成MockContentResolver和IsolatedContext的初始化),如:ide
@Override protected void setUp() throws Exception { // TODO Auto-generated method stub super.setUp(); mMockResolver = getMockContentResolver(); mProvider = mProviderClass.newInstance(); assertNotNull(mProvider); mProvider.attachInfo(getContext(), null); mMockResolver.addProvider(mProviderAuthority, mProvider); }
你最好在重寫getProvider這個方法來測試setup中是否成功建立的了被測的provider。完了以後的測試用例中就能夠使用生成的mMockResolver來進行測試了。(最後別忘了測試的具體內容,上篇轉的別人翻譯官網的說明「Contentprovider測試」)函數
最終測試用例如:測試
public void testInsert(){ ContentValues values = new ContentValues(); values.put(NotePad.NoteColumns.TITLE, "測試標題"); values.put(NotePad.NoteColumns.NOTE, "測試內容是什麼"); // insert //mMockResolver.insert(NotePad.NoteColumns.CONTENT_URI, values); String[] a = {"測試標題"}; // query Cursor c = mMockResolver.query(NotePad.NoteColumns.CONTENT_URI, null, NotePad.NoteColumns.TITLE + "=?",a, null); Log.d("Notepad", c.getCount()+""); while (c.moveToNext()) { Log.d("Notepad_insert", c.getString(c.getColumnIndex(NotePad.NoteColumns.NOTE))); Log.d("Notepad_insert", c.getString(c.getColumnIndex(NotePad.NoteColumns.NOTE))); assertEquals("測試標題", c.getString(c.getColumnIndex(NotePad.NoteColumns.TITLE))); assertEquals("測試內容是什麼", c.getString(c.getColumnIndex(NotePad.NoteColumns.NOTE))); } }