无法在Android测试应用中打开数据库

Dav*_*gay 6 android

我试图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()并且它可以工作.


Chr*_*ner 4

我在 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 数据库。当数据库关闭时,其内容将被销毁。

因此,您的测试数据库不会持久化,您可以轻松测试自定义插入/更新/查询/删除方法。

希望这可以帮助。如果还有任何问题,请随时提问。

干杯,克里斯托夫