Android Studio Unit测试SQLiteDataBase为null

时间:2015-05-28 14:41:54

标签: java android sqlite unit-testing

我是单元测试的新手,我想测试我的SQLiteDataBase。

我有一个名为 MySQLiteHelper 的类,它扩展了 SQLiteOpenHelper 。 我有一个名为 LocationDataHandler 的类,我用它来添加或删除我的DataBase中的元素。 我有一个 LocationDataHandlerTest 类,它扩展了 AndroidTestCase ,以测试我的 LocationDataHandler 类。

我正在尝试测试我的SQLite数据库,但我似乎在所有不同的上下文之间有点迷失。

这是我的代码:

//Context context = new Activity();

//IsolatedContext context = getMockContext();

//Context context = new MockContext();

//Context context = getInstrumentation().getContext();

  Context context = getContext();

  helper = new MySQLiteHelper(context);
  assertNotNull(helper);

  SQLiteDatabase db = helper.getWritableDatabase();
  assertNotNull(db); <---- it fails here !

正如您所看到的,我尝试过许多不同的背景,我看到人们使用和使用它们。我真的不明白为什么它在我的情况下不起作用。

我的问题是测试在“assertNotNull(db);”行上失败了这意味着我永远无法检索我的数据库。

我这样做是错误的吗?我没有使用正确的背景吗?

编辑:这是我的logcat:

junit.framework.AssertionFailedError
    at junit.framework.Assert.fail(Assert.java:55)
    at junit.framework.Assert.assertTrue(Assert.java:22)
    at junit.framework.Assert.assertNotNull(Assert.java:256)
    at junit.framework.Assert.assertNotNull(Assert.java:248)
    at junit.framework.TestCase.assertNotNull(TestCase.java:417)
    at com.databerries.LocationDataHandlerTest.testAddLocation(LocationDataHandlerTest.java:72)

4 个答案:

答案 0 :(得分:1)

是的,这是一个背景问题。所有这些上下文(包括您注释掉的内容)都是null。

您可以创建一个上下文:

context = new MockContext();

与您的应用程序相同的数据库(或其他资源),您可以使用(因为您使用的是AndroidTestCase):

context = getInstrumentation().getContext();

有一种创建和使用RoamingDelegatingContext的正确方法,但看起来你的测试并不需要。

您可以考虑阅读Android Testing Fundamentals,以帮助了解测试中的一些问题以及所需的访问/资源级别。

答案 1 :(得分:1)

在android中测试时,我们通常会模拟文件和数据库。如果我们在真实设备上进行测试,我们不希望影响现有文件。因此,在这些情况下,使用上下文将调用指向我们特定应用程序的文件系统。

因此,我们使用RenamingDelegatingContext嘲笑这些类型的操作。此类委托给定的上下文,但通过重命名的数据库/文件名执行数据库和文件操作。 您应该使用上下文:

RenamingDelegatingContext context = new RenamingDelegatingContext(getContext(), "test_db");
helper = new MySQLiteHelper(context);
assertNotNull(helper);
SQLiteDatabase db = helper.getWritableDatabase();
assertNotNull(db);

答案 2 :(得分:1)

AndroidTestCase扩展您的测试类,并使用mContext,如下面的代码示例:

public class MyDbHelperTest extends AndroidTestCase {

private DatabaseHelper db;

@Before
public void setUp() throws Exception {
    super.setUp();
    db = DatabaseHelper.getInstance(mContext);
}

@After
public void tearDown() throws Exception {
    db.close();
    super.tearDown();
}

public void testOpeningDb() throws Exception {
    assertNotNull(db);
    SQLiteDatabase sqliteDb = db.getWritableDatabase();
    assertNotNull(sqliteDb);
  }

}

mContextAndroidTestCase类继承到此类。 这将起作用,因为我有同样的问题。

答案 3 :(得分:0)

使用Android Studio进行测试

您应该使用MockContext代替RenamingDelegatingContext

使用InstrumentationTestCase

有关详细信息,请参阅此答案。 https://stackoverflow.com/a/29063736/1020456

这是我的代码。

public class DatabaseHelperTest extends InstrumentationTestCase{

private DatabaseHelper db;

@Before
public void setUp() throws Exception {
    super.setUp();

    MockContext context = new MockContext();
    db = DatabaseHelper.getInstance(context);
}

@After
public void tearDown() throws Exception {
    db.close();
    super.tearDown();
}

public void testInsertUserInteraction() throws Exception {
    assertNotNull(db.getReadableDatabase()); //should pass
}

}