Android Studio Unit测试SQLiteDataBase为null

Thé*_*ard 9 java sqlite android 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 !
Run Code Online (Sandbox Code Playgroud)

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

我的问题是测试在"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)
Run Code Online (Sandbox Code Playgroud)

ihe*_*nyi 1

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

您可以创建一个上下文:

context = new MockContext();
Run Code Online (Sandbox Code Playgroud)

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

context = getInstrumentation().getContext();
Run Code Online (Sandbox Code Playgroud)

有一种创建和使用 RoamingDelegatingContext 的正确方法,但您的测试似乎不需要它。

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