在这个组件的测试过程中,我们尝试了两种方式去获取数据库:
1、被测程序对外提供的ContentProvider接口;
2、通过Instrumentation的getTargetContext拿到的数据库列表,然后自定义一个SQLiteOpenHelper的子类去完成数据库的访问。
首先来说一下第一种方式的测试过程:
前提:要测试provider需要你知道被测程序提供出来的URI和AUTHORITY。
1、你需要新建一个测试类去继承ProviderTestCase2类,然后在测试类的无参构造函数中调用父类的构造方法super(Class providerClass, String providerAuthority);(当然最好是得有被测应用的源码,如果没有你得知道前提和provider类完整的包名。)
2、需要你重写setup方法,在super.setup()后面开始写(这句是必须,因为它会完成MockContentResolver和IsolatedContext的初始化),如:
@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))); } }