getMockContentResolver() 上的 ProviderTestCase2 returns 为空
ProviderTestCase2 returns null on getMockContentResolver()
我正在使用 ProviderTestCase2 测试我的 ContentProvider、LinesCP,但调用了 getMockContentResolver() returns null。
LinesCP 的 class 路径是 'com.olfybsppa.inglesaventurero/start/LinesCP.java'。这是显示权限的代码段。
public class LinesCP extends ContentProvider {
private static final String database_name = "lines.db";
public static final String AUTHORITY = "com.olfybsppa.inglesaventurero.start.LinesCP";
我 运行 它使用 BuildVariants 单元测试,我的其他单元测试有效。这是不起作用的测试。
public class ContentProviderUTest extends ProviderTestCase2<LinesCP> {
private static String ALPHABET = "AL-00";
private MockContentResolver cr;
public ContentProviderUTest () {
super(LinesCP.class, "com.olfybsppa.inglesaventurero.start");
//super(LinesCP.class, LinesCP.AUTHORITY);
}
public ContentProviderUTest (Class<LinesCP> providerClass, String providerAuthority) {
super(providerClass, providerAuthority);
}
@Override
protected void setUp() throws Exception {
super.setUp();
cr = getMockContentResolver(); // cr is null.
}
public void testSceneInsert() {
Uri uri = LinesCP.sceneTableUri;
ContentValues sceneValues = new ContentValues();
sceneValues.put(LinesCP.scene_id, ALPHABET);
sceneValues.put(LinesCP.english_title, "Alphabet");
sceneValues.put(LinesCP.spanish_title, "Alphabeto");
MockContentResolver cr = getMockContentResolver();
Uri resultingUri = getMockContentResolver().insert(uri, sceneValues);
assertNotNull(resultingUri);
long rowId = ContentUris.parseId(resultingUri);
assertTrue(rowId > 0);
}
}
我真的认为这应该可行,欢迎任何想法。
快速入门:我的 ContentProvider 名为 LinesCP。 LinesCP 拥有 table 个 CPHint。 CPHint 是我自己的class。我的测试是 ProviderInsertHintsTest,它扩展了 ProviderTestCase2
尽管 ProviderTestCase2 没有继承自 InstrumentationTestCase,但我运行使用 Build Variants 'Android Instrumentation Tests' 宁 ProviderInsertHintsTest。 ProviderInsertHintsTest 在我的 src/androidTest/java/ 文件夹中。所以,我之前认为 ProviderTestCase2 应该 运行 with BuildVariants 'Unit Test',我认为这是我的主要错误。
在 ProviderInsertHintsTest 中,我测试了 LineCP 的 insert(Uri, ContentValues) 方法。我在 setUp() 中得到了 mMockResolver。我使用 mMockResolver 插入我从 hint1 制作的 ContentValues。然后我使用 mMockResolver.query 从 Content Provider 获取 'fromCP' 。然后我断言原来的'hint1'等于'fromCP'.
public class ProviderInsertHintsTest extends ProviderTestCase2<LinesCP> {
private MockContentResolver mMockResolver;
private CPHint hint1;
private CPHint hint2;
public ProviderInsertHintsTest() {
super(LinesCP.class, LinesCP.AUTHORITY);
}
@Override
protected void setUp() throws Exception {
super.setUp();
mMockResolver = getMockContentResolver();
hint1 = new CPHint(1);
hint1.setNormalStartTime(1001);
hint1.setNormalEndTime(1010);
hint2 = new CPHint(2);
hint2.setNormalStartTime(2001);
hint2.setNormalEndTime(2010);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
public void testInsertHint () {
ContentValues cv = hint1.getContentValues(111);
mMockResolver.insert(LinesCP.hintTableUri, cv);
Cursor cursor = mMockResolver.query(LinesCP.hintTableUri, null, null, null, null);
cursor.moveToFirst();
assertEquals(1, cursor.getCount());
CPHint fromCP = CPHint.extractCPHint(cursor);
cursor.close();
assertTrue(fromCP.equals(hint1));
}
public void testInsertTwoHintsDeleteOne () {
ContentValues cv1 = hint1.getContentValues(111);
ContentValues cv2 = hint2.getContentValues(111);
mMockResolver.insert(LinesCP.hintTableUri, cv1);
mMockResolver.insert(LinesCP.hintTableUri, cv2);
Cursor cursor1 = mMockResolver.query(LinesCP.hintTableUri, null, null, null, null);
assertEquals(2, cursor1.getCount());
cursor1.close();
mMockResolver.delete(LinesCP.hintTableUri, Ez.where(BaseColumns._ID, "" + 1), null);
Cursor cursor2 = mMockResolver.query(LinesCP.hintTableUri, null, null, null, null);
assertEquals(1, cursor2.getCount());
cursor2.close();
}
}
唯一的信心飞跃是 CPHint.extractCPHint(光标光标)。只是用来晒代码的。它询问与列名匹配的 LineCP 列索引的值是多少,然后创建一个新的 CPHint。以防万一。
public static CPHint extractCPHint(Cursor cursor) {
Integer position = cursor.getInt(cursor.getColumnIndex(LinesCP.pos_id));
CPHint hint = new CPHint(position);
hint.setTimes(cursor.getLong(cursor.getColumnIndex(LinesCP.normal_start_time)),
cursor.getLong(cursor.getColumnIndex(LinesCP.normal_end_time)),
return hint;
}
为了测试删除,我使用 mMockResolver 并将 hint1 和 hint2 添加到 ContentProvider。然后我删除匹配 BaseColumns.ID 等于 1 的 CPHint。然后我再次查询 Content Provider 并断言它只有一行,而之前它有两行。
我正在使用 ProviderTestCase2 测试我的 ContentProvider、LinesCP,但调用了 getMockContentResolver() returns null。
LinesCP 的 class 路径是 'com.olfybsppa.inglesaventurero/start/LinesCP.java'。这是显示权限的代码段。
public class LinesCP extends ContentProvider {
private static final String database_name = "lines.db";
public static final String AUTHORITY = "com.olfybsppa.inglesaventurero.start.LinesCP";
我 运行 它使用 BuildVariants 单元测试,我的其他单元测试有效。这是不起作用的测试。
public class ContentProviderUTest extends ProviderTestCase2<LinesCP> {
private static String ALPHABET = "AL-00";
private MockContentResolver cr;
public ContentProviderUTest () {
super(LinesCP.class, "com.olfybsppa.inglesaventurero.start");
//super(LinesCP.class, LinesCP.AUTHORITY);
}
public ContentProviderUTest (Class<LinesCP> providerClass, String providerAuthority) {
super(providerClass, providerAuthority);
}
@Override
protected void setUp() throws Exception {
super.setUp();
cr = getMockContentResolver(); // cr is null.
}
public void testSceneInsert() {
Uri uri = LinesCP.sceneTableUri;
ContentValues sceneValues = new ContentValues();
sceneValues.put(LinesCP.scene_id, ALPHABET);
sceneValues.put(LinesCP.english_title, "Alphabet");
sceneValues.put(LinesCP.spanish_title, "Alphabeto");
MockContentResolver cr = getMockContentResolver();
Uri resultingUri = getMockContentResolver().insert(uri, sceneValues);
assertNotNull(resultingUri);
long rowId = ContentUris.parseId(resultingUri);
assertTrue(rowId > 0);
}
}
我真的认为这应该可行,欢迎任何想法。
快速入门:我的 ContentProvider 名为 LinesCP。 LinesCP 拥有 table 个 CPHint。 CPHint 是我自己的class。我的测试是 ProviderInsertHintsTest,它扩展了 ProviderTestCase2
尽管 ProviderTestCase2 没有继承自 InstrumentationTestCase,但我运行使用 Build Variants 'Android Instrumentation Tests' 宁 ProviderInsertHintsTest。 ProviderInsertHintsTest 在我的 src/androidTest/java/ 文件夹中。所以,我之前认为 ProviderTestCase2 应该 运行 with BuildVariants 'Unit Test',我认为这是我的主要错误。
在 ProviderInsertHintsTest 中,我测试了 LineCP 的 insert(Uri, ContentValues) 方法。我在 setUp() 中得到了 mMockResolver。我使用 mMockResolver 插入我从 hint1 制作的 ContentValues。然后我使用 mMockResolver.query 从 Content Provider 获取 'fromCP' 。然后我断言原来的'hint1'等于'fromCP'.
public class ProviderInsertHintsTest extends ProviderTestCase2<LinesCP> {
private MockContentResolver mMockResolver;
private CPHint hint1;
private CPHint hint2;
public ProviderInsertHintsTest() {
super(LinesCP.class, LinesCP.AUTHORITY);
}
@Override
protected void setUp() throws Exception {
super.setUp();
mMockResolver = getMockContentResolver();
hint1 = new CPHint(1);
hint1.setNormalStartTime(1001);
hint1.setNormalEndTime(1010);
hint2 = new CPHint(2);
hint2.setNormalStartTime(2001);
hint2.setNormalEndTime(2010);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
}
public void testInsertHint () {
ContentValues cv = hint1.getContentValues(111);
mMockResolver.insert(LinesCP.hintTableUri, cv);
Cursor cursor = mMockResolver.query(LinesCP.hintTableUri, null, null, null, null);
cursor.moveToFirst();
assertEquals(1, cursor.getCount());
CPHint fromCP = CPHint.extractCPHint(cursor);
cursor.close();
assertTrue(fromCP.equals(hint1));
}
public void testInsertTwoHintsDeleteOne () {
ContentValues cv1 = hint1.getContentValues(111);
ContentValues cv2 = hint2.getContentValues(111);
mMockResolver.insert(LinesCP.hintTableUri, cv1);
mMockResolver.insert(LinesCP.hintTableUri, cv2);
Cursor cursor1 = mMockResolver.query(LinesCP.hintTableUri, null, null, null, null);
assertEquals(2, cursor1.getCount());
cursor1.close();
mMockResolver.delete(LinesCP.hintTableUri, Ez.where(BaseColumns._ID, "" + 1), null);
Cursor cursor2 = mMockResolver.query(LinesCP.hintTableUri, null, null, null, null);
assertEquals(1, cursor2.getCount());
cursor2.close();
}
}
唯一的信心飞跃是 CPHint.extractCPHint(光标光标)。只是用来晒代码的。它询问与列名匹配的 LineCP 列索引的值是多少,然后创建一个新的 CPHint。以防万一。
public static CPHint extractCPHint(Cursor cursor) {
Integer position = cursor.getInt(cursor.getColumnIndex(LinesCP.pos_id));
CPHint hint = new CPHint(position);
hint.setTimes(cursor.getLong(cursor.getColumnIndex(LinesCP.normal_start_time)),
cursor.getLong(cursor.getColumnIndex(LinesCP.normal_end_time)),
return hint;
}
为了测试删除,我使用 mMockResolver 并将 hint1 和 hint2 添加到 ContentProvider。然后我删除匹配 BaseColumns.ID 等于 1 的 CPHint。然后我再次查询 Content Provider 并断言它只有一行,而之前它有两行。