2013-12-17 71 views
2

我不認爲這是一個IntelliJ問題,但是無論如何給出所有細節。我在IntelliJ 13中創建了一個Android測試應用程序,我試圖在Android應用程序中測試一些現有的代碼。這段代碼接受一個I​​nputStream,它是一個要讀取的JSON文件。我正在嘗試測試讀取此文件InputStream的方法。我有以下幾點:在IntelliJ Android應用程序中讀取文件資產進行測試

我的項目結構如下:

android_test 
- libs 
- res 
- src 
- testAssetes 
    - file.json 

而我的測試方法是:

public void testParseFile() { 
    FileInputStream in = new FileInputStream(new File("./testAssets/file.json")); 
    // code continues.. 
} 

我一直得到一個FileNotFound例外。我也試過如下:

android_test 
- libs 
- res 
- src 
    - com 
    - test 
     - file.json 

然後我的代碼修改爲:

InputStream in = getClass().getResourceAsStream("/com/test/file.json") 

在這種情況下,InputStream中始終爲空。我用類似的代碼創建了一個常規的java項目,它工作得很好。不確定它是否與InstrumentTestRunner的工作方式或交易內容有關。

更新:我剛剛意識到問題可能是因爲這些測試運行在InstrumentationTestRunner上,它在仿真器/設備上執行。所以我想我需要知道的是如何將我的測試文件放到該文件系統中並讀取它進行測試。

回答

0

您可以通過「運行>編輯配置」指定android_test目錄中的IntelliJ「工作目錄」

+0

嗯,好的。但是當這些測試從Ant或adb運行時呢? – Gregg

+0

如果你從'android_test'啓動'ant test',那麼'android_test'將會是'pwd' –

0

一種方式做到這一點是使用了一下反思。我用的實用方法是:

public String assetFileContents(final String fileName) throws IOException { 
    StringBuilder text = new StringBuilder(); 
    InputStream fileStream = this.getClass().getClassLoader() 
      .getResourceAsStream("assets/" + fileName); 

    BufferedReader reader = new BufferedReader(new InputStreamReader(fileStream)); 
    String line; 
    while((line = reader.readLine()) != null) { 
     text.append(line); 
    } 
    return text.toString(); 
} 

這返回String內容fileName。另外,我一直在測試文件夾assets/src/tests/assets(通過assets.srcDirbuild.gradle,我覺得默認有instrumentTests代替tests

我不認爲InstrumentTestRunner說法是相關的。只要它位於源路徑文件夾中,它應該與應用程序一起打包。請參閱我的存儲庫here(僅供參考,我目前正在重構項目,他們可能已在稍後轉移到另一個分支)。請參閱我的知識庫文章here

+0

如果你使用純Java,也就是非Android單元測試用例,這種方法不起作用,因爲這個原因:https://code.google.com/p/android/issues/detail?id=64887#c7 – drc

相關問題