[英]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.