繁体   English   中英

Android Studio单元测试SQLiteDataBase为空

[英]Android Studio Unit test SQLiteDataBase is null

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

我有一个名为MySQLiteHelper的类,该类扩展了SQLiteOpenHelper 我有一个名为LocationDataHandler的类,可用于在数据库中添加或删除元素。 我有一个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)

是的,这是一个上下文问题。 所有这些上下文(包括您注释掉的上下文)都为空。

您可以创建一个上下文:

context = new MockContext();

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

context = getInstrumentation().getContext();

有一种正确的方法可以创建和使用RoamingDelegatingContext,但是似乎不需要进行测试。

您可以考虑阅读《 Android测试基础知识》,以帮助您了解一些测试问题以及所需的访问/资源级别。

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

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

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

从扩展您的测试类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);
  }

}

mContext是继承了从类AndroidTestCase类。 由于我遇到了同样的问题,这将起作用。

为了使用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
}

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM