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 并断言它只有一行,而之前它有两行。