使用ContentProviders和数据库进行Android单元测试

使用ContentProviders和数据库进行Android单元测试,android,database,unit-testing,junit,android-contentprovider,Android,Database,Unit Testing,Junit,Android Contentprovider,我有一个应用程序,它使用ContentProvider来提供数据,而不是直接访问数据库。应用程序按预期工作,但我在单元测试方面遇到了一个问题:如何强制ContentProvider使用测试数据库而不是“活动”数据库?如果我没有使用ContentProvider,我可以将不同的数据库名称传递给我的SQLiteOpenHelper子类的构造函数,但现在通过调用ContentProvider中的onCreate()来创建数据库: @Override public boolean onCreat

我有一个应用程序,它使用ContentProvider来提供数据,而不是直接访问数据库。应用程序按预期工作,但我在单元测试方面遇到了一个问题:如何强制ContentProvider使用测试数据库而不是“活动”数据库?如果我没有使用ContentProvider,我可以将不同的数据库名称传递给我的
SQLiteOpenHelper
子类的构造函数,但现在通过调用ContentProvider中的onCreate()来创建数据库:

    @Override
public boolean onCreate()
{
    UKMPGDataProvider.init(getContext(), Constants.DATABASE_NAME);
    return (UKMPGDataProvider.getWritableDatabase() == null) ? false : true;
}
如您所见,数据库名称是硬编码的


有没有办法将测试名称传递给ContentProvider?

您应该使用该模式来避免这种情况

经过一番挖掘,我发现扩展ProviderTestCase2会自动向数据库添加前缀。

谢谢Flexo,但对onCreate的调用来自系统,因此我无法注入任何内容。我可以使用一个公共标志来指定我想要创建的数据库名称,但它似乎不是很优雅。因此,使用ProviderTestCase2,我是否可以测试我的ListContactActivity行为,而不影响真正的Android Contact ContentProvider?你有任何有效的测试代码吗?