如何从我的单元测试应用程序将数据库测试夹具传输到设备

问题描述:

我正在编写Android JUnit测试并希望复制/重置测试夹具文件(这是一个SQLite数据库文件)。如果我处于主要应用程序,我知道我可以将文件放置在资产目录中,然后使用getResources().getAssets().open(sourceFile)如何从我的单元测试应用程序将数据库测试夹具传输到设备

但是,此API似乎不可用于ActivityInstrumentationTestCase2类。

是否有从测试PC复制文件的简单方法,还是应该在设备上保留测试夹具的全新副本并将其复制到临时文件中?

谢谢!

我已经完成了这项工作(以一种不太优雅的方式),是将测试夹具复制到我的设备(或模拟设备)上。我将它命名为“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(); 
} 

测试应用程序和主应用程序中的资源可以在仪器测试用例中单独访问。如果你想访问是在测试项目本身的资源/原材料或资产的文件夹的资源,你可以使用

getInstrumentation().getContext().getResources() 

访问资源的应用程序进行测试(“目标”应用程序),使用

getInstrumentation().getTargetContext().getResources() 

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

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

返回一个InputStream。没有办法修改文件。这是因为资产被压缩存储在APK中,并且根本不可写。

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

+0

非常感谢您的好评。我发现我仍然需要了解更多关于Android测试的知识。当我能够实施其中一种解决方案时,我会更新你。 – 2010-10-07 02:15:23

+0

当我尝试在我的测试应用程序中执行= getResources()。getAssets()。open(“test.txt”)中的InputStream,并在我的资产目录中放置名为“test.txt”的文件时,出现异常。 – 2010-10-16 04:58:44

+1

@glenviewjeff在什么情况下你调用getResources()?在测试方法中还是在测试中启动的活动中?您确定您使用的'Resources'来自Instrumentation的getContext()而不是'getTargetContext()'吗? – 2010-10-17 02:12:14