我正在尝试在Android应用程序中测试SQLiteOpenHelper
子类的插入和检索方法。 SQLLiteHelper子类存在于测试中的应用程序中,并在安装文件夹中创建数据库。但是,单元测试存在于测试应用程序的InstrumentTestCase
中,我想在测试应用程序中创建一个测试数据库。
不幸的是,如果我尝试在测试应用中创建/打开数据库,我会遇到以下异常:
android.database.sqlite.SQLiteException: unable to open database file
at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1584)
at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:638)
at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:168)
at com.kizoom.android.mybus.storage.MyStopsDatabase.getMyStops(MyStopsDatabase.java:63)
at com.kizoom.mybus.test.MyStopsDatabaseTest.testGetMyStops(MyStopsDatabaseTest.java:24)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:191)
at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:181)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:164)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:151)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:425)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1520)
The following information appears in LogCat.
02-21 11:52:16.204: ERROR/Database(1454): sqlite3_open_v2("/data/data/com.kizoom.mybus.test/databases/MyStops", &handle, 6, NULL) failed
02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454): Couldn't open MyStops for writing (will try read-only):
02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454): android.database.sqlite.SQLiteException: unable to open database file
02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1584)
02-21 11:52:16.204: ERROR/SQLiteOpenHelper(1454): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:638)
有人知道为什么会失败吗?
答案 0 :(得分:33)
在创建db帮助程序期间,我没有使用getInstrumentation().getContext()
作为上下文,而是将其更改为getInstrumentation().getTargetContext()
并且它可以正常工作。
答案 1 :(得分:4)
我在TestDatabaseHelper * -TestCases中使用以下setUp() - Method:
@Override
protected void setUp() throws Exception {
super.setUp();
final SQLiteDatabase db = SQLiteDatabase.create(null);
Context context = new MockContext() {
@Override
public SQLiteDatabase openOrCreateDatabase(String file, int mode, SQLiteDatabase.CursorFactory factory) {
return db;
};
};
mHelper = new MyCustomSubclassOfDatabaseHelper(context);
mDb = mHelper.getWritableDatabase();
wipeData(mDb);
}
public void wipeData(SQLiteDatabase db) {
db.execSQL("DELETE FROM " + TABLENAME + ";");
}
这很酷,因为文档说的是SQLiteDatabase.create():
创建一个支持内存的SQLite数据库。它的内容将被销毁 数据库关闭时。
因此,您的测试数据库不会保留,您可以轻松测试自定义插入/更新/查询/删除方法。
希望这会有所帮助。如果还有任何问题,请随时提出。
干杯, 克里斯托弗