我试图SQLiteOpenHelper在Android应用程序中测试我的子类的插入和检索方法.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)
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么会失败?
Avi*_*ral 33
而不是getInstrumentation().getContext()在创建db帮助程序期间使用上下文,我将其更改为getInstrumentation().getTargetContext()并且它可以工作.
我在 TestDatabaseHelper*-TestCases 中使用以下 setUp()-方法:
@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 + ";");
}
Run Code Online (Sandbox Code Playgroud)
这非常酷,因为文档提到了 SQLiteDatabase.create():
创建内存支持的 SQLite 数据库。当数据库关闭时,其内容将被销毁。
因此,您的测试数据库不会持久化,您可以轻松测试自定义插入/更新/查询/删除方法。
希望这可以帮助。如果还有任何问题,请随时提问。
干杯,克里斯托夫
| 归档时间: |
|
| 查看次数: |
3841 次 |
| 最近记录: |