在IntelliJ Android应用程序中读取测试的文件资产

时间:2013-12-17 00:44:44

标签: android file-io junit intellij-idea

我认为这不是一个IntelliJ问题,而是提供所有细节。我在IntelliJ 13中创建了一个Android测试应用程序,我正在尝试测试Android应用程序中的一些现有代码。这段代码接受一个I​​nputStream,它是一个要读取的JSON文件。我正在尝试测试一个读取此文件InputStream的方法。我有以下内容:

我的项目结构如下:

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始终为null。我用类似的代码创建了一个常规的java项目,它运行得很好。不确定它是否与InstrumentTestRunner的工作方式或处理方式有关。

更新:我刚刚意识到问题可能是因为这些测试正在使用在仿真器/设备上执行的InstrumentationTestRunner运行。所以我认为我需要知道的是如何将我的测试文件放到该文件系统上并将其读入以进行测试。

2 个答案:

答案 0 :(得分:0)

您可以通过“运行>编辑配置”在IntelliJ中将android_test目录指定为“工作目录”

答案 1 :(得分: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的{​​{1}}文件夹中(通过assets.srcDir中的build.gradle设置,我认为默认值为instrumentTests而不是tests })

我不认为InstrumentTestRunner参数是相关的。只要它在源路径文件夹中,就应该与应用程序一起打包。

要查看使用测试文件运行的示例,请参阅我的存储库here(仅供参考,我目前正在重构项目,他们可能会在以后转移到另一个分支)。