2013-12-17 34 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

相关问题