如何在 Android 应用程序和本地单元测试中加载相同的 JSON 文件?

How to load the same JSON file in both an Android app and local unit test?

我有一个 Android 项目显示来自 JSON 文件的数据。按照以下方法从 assets 目录中读取文件:

src/main/assets/my_file.json

InputStream is = getResources().getAssets().open(filename);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
// use StringBuilder to get file contents as String

我还有需要相同 JSON 文件的本地单元测试。为了避免 Instrumentation 测试的缓慢,我目前正在加载文件的副本,如下所示:

src/main/resources/my_copy.json

File testData = new File(getClass().getResource(filename).getPath());
InputStream is = new FileInputStream(testData);
// read File as before

是否有一种方法可以让 JSON 文件存储在一个位置,而 运行 在本地 JVM 上进行单元测试?

如果您使用的是 Robolectric,请参阅 this answer

请注意,"assets" 目录是一个 Android 概念,它不同于 Java 资源。也就是说,您还可以将 JSON 文件从 assets 移动到 resources,然后像在任何 Java 中一样从 Android 和 JVM 形式使用它]申请。

可以使用 ClassLoader#getResourceAsStream() 在 Android 个应用程序中访问资源目录中的文件。这 returns 一个 InputStream,然后可以用来读取文件。这避免了在资源和资产目录之间复制文件。

InputStream is = getClass().getClassLoader().getResourceAsStream("my_file.json");
BufferedReader br = new BufferedReader(new InputStreamReader(is));

String line = null;
StringBuilder sb = new StringBuilder();

while ((line = br.readLine()) != null) {
    sb.append(line);
    }
}
String json = sb.toString();