如何在 Android 中的 Android 测试和单元测试之间共享 JSON 文件

How to share JSON files between Android Test and Unit Tests in Android

我尝试了此博客评论中给出的建议 - http://blog.danlew.net/2015/11/02/sharing-code-between-unit-tests-and-instrumentation-tests-on-android/

但是 Android 测试无法读取该文件;单元测试工作得很好。

build.gradle:

sourceSets {
    String sharedTestDir = 'src/sharedTestHelpers/java'
    String sharedTestAssetDir = 'src/sharedTestHelpers/assets'
    test {
        java.srcDir sharedTestDir
        assets.srcDir sharedTestAssetDir
    }
    androidTest {
        java.srcDir sharedTestDir
        assets.srcDir sharedTestAssetDir
    }
}

测试创建者class:

public class TestDataCreator {
  public static String readFromFile(String fileName) throws IOException    
  {
    return FileUtils.readFileToString(new    
    File("src/sharedTestHelpers/assets/" + fileName));
  }}

项目结构:

有什么指点吗?

对于仪器测试,您应该使用 Android API 从资产文件夹中读取文件。

如果您要读取的文件位于测试应用程序的 assets 文件夹中(在您的示例中就是这种情况),您必须使用测试应用程序的 Context。可以通过 InstrumentationRegistry.getContext() 解析测试应用程序上下文:

// Opens an InputStream for the file src/sharedTestHelpers/assets/test.json InstrumentationRegistry.getContext().getAssets().open("test.json");

如果文件在您需要使用的应用程序的资产文件夹中 InstrumentationRegistry.getTargetContext():

// Opens an InputStream for the file src/main/assets/app.json InstrumentationRegistry.getTargetContext().getAssets().open("app.json");

在深入研究之后我的观察

Unit test can access this because it does not run in android .

对于Android测试是有问题的因为

  1. Android 在 AVD/Device
  2. 中测试
  3. 如果您查看您的 apk(通过将其制作为 testApk.zip 并解压),没有像 /sharedTestHelpers/assets/ 这样的文件夹 只有 asset 文件夹
  4. 所以为了访问资产文件夹你需要"Context"为了在测试中访问上下文你可以使用

    InstrumentationRegistry.getContext()