3

我目前正在测试 Android API,为此,我开发了一个应用程序,该应用程序复制了我事先制作的数据库并测试了该应用程序(它调用了几个 Android 类)。有人指导我使用 Robolectric 来获取 Android 源代码,但是,这引起了一些问题。我的应用程序在没有它的情况下运行得很好,以及我的测试,但现在我在复制我的数据库时遇到了错误。每当我运行测试时,我的 catch 都会给我一个复制数据库的错误,并且取出该 catch 会导致 AssertionFailureError

assertTrue(activity.accessAdapter() != null);
assertTrue(activity.accessAdapter().accessHelper().checkDatabase()); // Here

我假设这与不复制数据库有关,就好像我放回代码中的 try-catch 一样,它会导致在复制数据库时重新设置它们。

这是我的 SQLiteOpenHelper 的代码,或者至少是在复制数据库时调用的代码。

public void createDatabase() throws IOException
{
    this.getReadableDatabase();
    this.close();
    try {
        copyDatabase();
        Log.e(TAG, "Database created.");
    } catch (IOException e) {
        throw new Error("Error copying database.");
    }
}

private void copyDatabase() throws IOException {
    InputStream input = ((ShadowContextWrapper) shadowContext).getAssets().open(DATABASE_NAME);
    String outFileName = DATABASE_PATH + DATABASE_NAME;
    OutputStream output = new FileOutputStream(outFileName);
    byte[] buffer = new byte[1024];
    int length;
    while ((length = input.read(buffer)) > 0) output.write(buffer, 0, length);
    output.flush();
    output.close();
    input.close();
}

我认为问题可能与上下文有关,所以我创建了一个 ShadowContext,但这也无济于事。还有其他错误,但这些只是相互调用的方法,一直到我的 SQLiteOpenHelper 中的 createDatabase()。

有谁知道我如何使用 Robolectric 复制这个数据库?我将它保存在我的应用程序的资产中,但显然,如果没有模拟器,这是没有意义的。谢谢你。

PS 如果需要,我可以添加更多代码,这正是我一开始认为是必要的。

4

0 回答 0