我是单元测试的新手,我想测试我的 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 Testing Fundamentals帮助理解测试的一些问题以及所需的访问权限/资源级别。
关于java - Android Studio 单元测试 SQLiteDataBase 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30509788/