2010-09-24 43 views
5

我正在編寫Android JUnit測試並希望複製/重置測試夾具文件(這是一個SQLite數據庫文件)。如果我處於主要應用程序,我知道我可以將文件放置在資產目錄中,然後使用getResources().getAssets().open(sourceFile)如何從我的單元測試應用程序將數據庫測試夾具傳輸到設備

但是,此API似乎不可用於ActivityInstrumentationTestCase2類。

是否有從測試PC複製文件的簡單方法,還是應該在設備上保留測試夾具的全新副本並將其複製到臨時文件中?

謝謝!

回答

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(); 
} 
6

測試應用程序和主應用程序中的資源可以在儀器測試用例中單獨訪問。如果你想訪問是在測試項目本身的資源/原材料或資產的文件夾的資源,你可以使用

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