5

我正在编写一个 Android JUnit 测试并想要复制/重置一个测试夹具文件(它是一个 SQLite 数据库文件。)如果我在主应用程序中,我知道我可以将文件放在资产目录中并使用getResources().getAssets().open(sourceFile)

但是,该 API 似乎在该类中不可用ActivityInstrumentationTestCase2

有没有一种简单的方法可以从测试 PC 复制文件,或者我应该在设备上保留一个新的测试夹具副本并将其复制到一个临时文件上?

谢谢!

4

2 回答 2

6

测试应用程序和主应用程序中的资源可在仪器测试用例中单独访问。如果要访问测试项目本身的 res/raw 或 assets 文件夹中的资源,可以使用

getInstrumentation().getContext().getResources()

要访问正在测试的应用程序(“目标”应用程序)中的资源,请使用

getInstrumentation().getTargetContext().getResources()

但是请注意,您永远不能修改 assets 文件夹中的文件;

getResources().getAssets().open(sourceFile)

返回一个输入流。没有办法修改文件。那是因为资产被压缩存储在 APK 中,并且根本不是真正可写的。

如果您要做的是修改您正在测试的 Activity 使用的文件的路径,您应该使用ActivityUnitTestCasesetActivityContext()RenamingDelegatingContext。这允许您通过指定目录前缀将上下文中的文件和数据库访问重定向到新目录。您甚至可以使用更复杂的构造函数来包装大多数操作的目标上下文,但将测试应用程序的上下文用于文件操作,因此活动将访问存储在测试应用程序而不是主应用程序中的文件,但仍会使用其他资源初级应用。

于 2010-10-06T23:03:54.813 回答
3

我所做的(以一种不太优雅的方式)是将测试夹具复制到我的设备(或模拟设备)上。我将其命名为“cleantestdatabase.db”。然后在测试代码中,我将它复制到“testdatabase.db”,以便我可以使用我的测试对其进行修改,但将其重置为已知状态。这是代码:

copyFile("cleantestdatabase.db", "testdatabase.db");

private void copyFile(String source, String dest) throws IOException{
    String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath() + getActivity().getString(R.string.default_dir);
    File newDir = new File(rootPath);
    boolean result = newDir.mkdir();
    if(result == false){
        Log.e("Error", "result false");
    }

    InputStream in = new FileInputStream(rootPath + source);    
    File outFile = new File(rootPath + dest);
    if(outFile.exists()) {
        outFile.delete();
    }
    outFile.createNewFile();

    OutputStream out = new FileOutputStream(outFile);
    byte[] buf = new byte[1024];
    int len;
    while ((len = in.read(buf)) > 0) {
        out.write(buf, 0, len);
    }
    in.close();
    out.close();
}
于 2010-10-16T05:03:21.720 回答