我是单元测试的新手,我想测试我的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)
答案 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);
}
}
mContext
从AndroidTestCase
类继承到此类。
这将起作用,因为我有同样的问题。
答案 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
}
}