如何在Android单元测试中读取仅测试文件

Krz*_*mic 23 android unit-testing gradle android-studio

对于我的Android应用程序,我正在编写需要读取一些文件的单元测试.由于这些是仅测试文件,我不希望它们出现在我的res文件夹中,因为我不希望它们最终出现在我的最终.apk文件中.

我想做一些类似于这个问题但使用新添加的(在Gradle 1.1中)单元测试支持(而不是仪器测试).

我的项目结构如下:

/app
   /src
      /main
         /java/my.module/myClass.java
         /res/production_resources_go_here
      /test
         /java/my.module/myClassTest.java
         /resources/testFile.txt
Run Code Online (Sandbox Code Playgroud)

我的myClassTest测试应该是什么样才能成功阅读testFile.txt

Mar*_*ski 43

在提出这个问题的时候,这根本就没有用.幸运的是,这已经解决了.

您必须将文本文件放在app/src/test/resourcesOP尝试执行的文件夹下.此外,它必须与您的测试类位于同一个包中.因此,如果您在文件夹ReadFileTest.java中包,那么您的测试文件应该在.com.example.testapp/src/test/javaapp/src/test/resources/com/example/test

测试文件夹结构

然后你可以像这样找到你的文本文件:

getClass().getResourceAsStream("testFile.txt")
Run Code Online (Sandbox Code Playgroud)

这将打开InputStream文本文件.如果您不确定如何使用它,可以使用以下几种方法:将InputStream读取/转换为String

  • 如果有人对“ InputStream”结果_null_有疑问,请添加斜杠,例如“ getClass()。getResourceAsStream(“ / testFile.txt”)”。 (3认同)
  • 对于那些因输入流为空而陷入困境的人,还有一个提示,请确保在创建资源目录路径时不要添加点(例如 com.example.test)。Android Studio 会在用点创建时自动在 java 文件夹内创建目录,而不是资源目录 (3认同)
  • 在 Kotlin 中, this.javaClass.getResourceAsStream("testFile.txt") (3认同)
  • 如果可以的话,我会赞成 100 次。关键真的是让路径正确。谢谢谢谢!:D (2认同)

You*_*jae 11

其次@ Deepansu的回答,我统一化的测试数据都TestAndroidTest{project root}/sampledata其中是Android Studio中的默认位置目录New > Sample Data Directory命令。

1.在您的项目中,右键单击并单击New > Sample Data Directory。这将在 中创建sampledata目录app,该目录与build.gradle文件srcbuild目录具有相同的层次结构。

2.在 中build.gradle,添加如下脚本;

android {
    sourceSets {
        test {
           resources.srcDirs += ['sampledata']
        }
        androidTest {
           resources.srcDirs += ['sampledata']
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

3. Sync在gradle中。

现在,我们可以将测试资源文件放在一个目录中,并在两个测试环境中使用它们。

您可以阅读文件如下;

// use somewhere at test logic. Note that slash symbol is required (or not).
jsonObject = new JSONObject(readFromFile("/testFile.json"));

// a method to read text file.
public String readFromFile(String filename) throws IOException {
    InputStream is = getClass().getResourceAsStream(filename);
    StringBuilder stringBuilder = new StringBuilder();
    int i;
    byte[] b = new byte[4096];
    while ((i = is.read(b)) != -1) {
        stringBuilder.append(new String(b, 0, i));
    }
    return stringBuilder.toString();
}
Run Code Online (Sandbox Code Playgroud)


Dee*_*shu 9

将其添加到build.gradle:

android {
    sourceSets {
        test {
           resources.srcDirs += ['src/test/resources']
        }
        androidTest {
           resources.srcDirs += ['src/androidTest/resources']
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

要获得单元测试可访问的资源,请将文件添加到: src/test/resources.对于仪器测试,请将您的文件添加到:src/androidTest/resources.