在Android中测试自定义ContentProvider

时间:2011-04-29 23:56:50

标签: android unit-testing android-contentprovider

我已经编写了我的内容提供程序,它应该在SqlLite数据库中包装对2个表的访问。现在我想为它编写一些测试用例,但我从来没有这样做过。阅读开发者指南中的部分后,我必须说我没有得到任何测试。

以下是我的代码。这是测试项目中唯一与我的主项目相对应的类。当我在Eclipse中执行它时,模拟器正确启动,软件包已安装,但它没有运行测试:

  

测试运行失败:测试运行不完整。   预计1次测试,收到0

这是测试类:

public class ArticleProviderTest extends ProviderTestCase2<ArticleProvider> {

    static final Uri[] validUris = new Uri[] { Articles.CONTENT_URI, 
       Pictures.CONTENT_URI,
       Pictures.getContentUriForArticleId(1) };

    public ArticleProviderTest(Class<ArticleProvider> providerClass, String providerAuthority) {
        super(providerClass, providerAuthority);
    }

    @Override
    protected void setUp() throws Exception {
        super.setUp();
    }

    public void testQuery() {
        ContentProvider provider = getProvider();    
        for (Uri uri : validUris) {
            Cursor cursor = provider.query(uri, null, null, null, null);
            assertNotNull(cursor);
        }    
    }
}

清单文件,如果有帮助:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="fr.marvinlabs.xxxx"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7" />
    <instrumentation android:targetPackage="fr.marvinlabs.xxxx" android:name="android.test.InstrumentationTestRunner" />
    <application android:icon="@drawable/icon" android:label="@string/app_name">
    <uses-library android:name="android.test.runner" />
    </application>
</manifest>

当我在调试配置中启动时,构造函数和setUp中的断点不会被触发。 ?!

我也没有在网上找到太多信息。有人可以帮我理解应该如何设置测试(基本上创建一个测试数据库文件,用一些数据填充它,查询它,......)?

3 个答案:

答案 0 :(得分:7)

好的,明白了。错误是我没有为测试类提供默认构造函数。我覆盖了错误的构造函数:

public ArticleProviderTest(Class<ArticleProvider> providerClass, String providerAuthority) {
    super(providerClass, providerAuthority);
}

现在是

public ArticleProviderTest() {
    super(ArticleProvider.class, "com.blah.azerty");
}

凌晨2点是你无法完全阅读文档的时间,下午更好:)

答案 1 :(得分:3)

我发现SDK提供的NotePad示例项目中的NotePadProviderTest.java是一个良好的开端。

答案 2 :(得分:2)

您应该实现创建和删除数据库的setUp()tearDown()方法。

这是一个很好的例子:http://www.google.com/codesearch/p?hl=en#IrmxZtZAa8k/tests/src/com/android/providers/calendar/CalendarProvider2Test.java