Android Studio单元测试:读取数据(输入)文件

Android Studio单元测试:读取数据(输入)文件,android,unit-testing,android-studio,Android,Unit Testing,Android Studio,在单元测试中,如何在不硬编码路径的情况下从(桌面)文件系统上的json文件读取数据 我希望从文件中读取测试输入(用于我的解析方法),而不是创建静态字符串 该文件与我的单元测试代码位于同一位置,但如果需要,我也可以将其放置在项目中的其他位置。我正在使用Android Studio。取决于Android gradle插件版本: 1。版本1.5及更高版本: 只需将json文件放到src/test/resources/test.json中,并将其引用为 classLoader.getResource("

在单元测试中,如何在不硬编码路径的情况下从(桌面)文件系统上的json文件读取数据

我希望从文件中读取测试输入(用于我的解析方法),而不是创建静态字符串


该文件与我的单元测试代码位于同一位置,但如果需要,我也可以将其放置在项目中的其他位置。我正在使用Android Studio。

取决于
Android gradle插件
版本:

1。版本1.5及更高版本:

只需将json文件放到
src/test/resources/test.json中,并将其引用为

classLoader.getResource("test.json"). 
不需要对渐变进行修改

2。低于1.5的版本:(或者如果由于某种原因上述解决方案不起作用)

  • 确保您至少正在使用。按照链接正确设置Android Studio

  • 创建
    test
    目录。将单元测试类放在
    java
    目录中,并将资源文件放在
    res
    目录中。Android Studio应将其标记如下:

  • 创建
    gradle
    任务,将资源复制到classes目录中,使它们对
    classloader
    可见:

    android{
       ...
    }
    
    task copyResDirectoryToClasses(type: Copy){
        from "${projectDir}/src/test/res"
        into "${buildDir}/intermediates/classes/test/debug/res"
    }
    
    assembleDebug.dependsOn(copyResDirectoryToClasses)
    
  • 现在,您可以使用此方法获取文件资源的
    文件
    引用:

    private static File getFileFromPath(Object obj, String fileName) {
        ClassLoader classLoader = obj.getClass().getClassLoader();
        URL resource = classLoader.getResource(fileName);
        return new File(resource.getPath());
    }
    
    @Test
    public void fileObjectShouldNotBeNull() throws Exception {
        File file = getFileFromPath(this, "res/test.json");
        assertThat(file, notNullValue());
    }
    
  • 通过Ctrl+Shift+F10对整个类或specyfic测试方法运行单元测试

  • 如果您转到Run->Edit configurations->JUnit,然后为单元测试选择运行配置,则会有一个“工作目录”设置。这应该指向json文件所在的位置。请记住,这可能会破坏其他测试。

    对于本地单元测试(与插装测试相比),您可以将文件放在
    src/test/resources
    下,并使用classLoader读取它们。例如,下面的代码将在资源目录中打开
    myFile.txt
    文件

    InputStream in = this.getClass().getClassLoader().getResourceAsStream("myFile.txt");
    
    它与

    • Android Studio 1.5.1
    • gradle插件1.3.1

    我在Android Studio的测试资源方面遇到了很多问题,因此为了清晰起见,我设置了一些测试。在我的
    mobile
    (Android应用程序)项目I添加了以下文件:

    mobile/src/test/java/test/ResourceTest.java
    mobile/src/test/resources/test.txt
    mobile/src/test/resources/test/samePackage.txt
    
    测试类别(所有测试均通过):

    在同一个根项目中,我有一个名为
    data
    Java(不是Android)项目。如果向数据项目添加相同的文件:

    data/src/test/java/test/ResourceTest.java
    data/src/test/resources/test.txt
    data/src/test/resources/test/samePackage.txt
    
    如果我从Android Studio执行上述所有测试,那么这些测试都将失败,但它们会在命令行中通过
    /gradlew data:test
    。 为了绕过它,我使用了这个hack(在Groovy中)

    用法:
    resource('/test.txt')


    Android Studio 2.3,Gradle 3.3在我的例子中,解决方案是添加到Gradle文件中

    sourceSets {
        test.resources.srcDirs += 'src/unitTests/resources'
      } 
    
    之后,AS 2.3.1找到了所有内容

    javaClass.classLoader.getResourceAsStream("countries.txt")
    

    我想我应该在这里补充我的发现。我知道这有点旧,但对于较新版本的Gradle,没有src/test/resources目录,整个项目只有一个resources目录,您必须将这一行添加到Gradle文件中

    android {
       testOptions {
          unitTests {
             includeAndroidResources = true
          }
        }
    }
    
    通过执行此操作,您可以通过以下方式访问您的资源:

     this.getClass().getClassLoader().getResourceAsStream(fileName);
    

    我一直在寻找这个问题,但找不到答案,所以我决定在这里帮助其他人。

    事实上,这就是仪器测试(运行Android Studio版本3.5.3,Android Gradle插件版本3.5.3,Gradle版本6.0.1)对我有效的原因:

  • 将文件放入
    src/androidTest/assets
    文件夹
  • 在测试文件中:

  • InputStream is=InstrumentationRegistry.getInstrumentation().getContext().getAssets().open(“filename.txt”)

    我尝试了几乎所有与IOUtils.toString(this.getClass().getResourceAsStream(“test_documents.json”),“UTF-8”)的组合,它总是返回null。可能是因为这些文件不会包含在jar中。我们讨论的是涉及android emulator/device的单元测试吗?@Android777我想我们讨论的是最新版本的android Studio@Frank中引入的新单元测试支持,您将
    测试文档.json
    放在哪里?资产目录?是的,我们谈论的是新的单元测试支持,不涉及模拟器/设备。我没有把它放在assets目录中,因为这样它就和liveapk打包在一起了。我把它和测试(java)文件放在同一个文件夹中,然后使用这个.getClass().getResourceAsStream(test.json)?我在那里添加了文件,在项目的根目录中,它仍然找不到文件。这可以用于使用
    new File()
    或类似方法加载文件,但不能直接使用上面描述的类路径加载方法。这也有点棘手,因为每个新的运行配置都需要设置工作目录,默认情况下AS和Gradle命令行喜欢使用不同的工作目录。。。真是太棒了!你的编辑,没有仪器测试,效果很好,谢谢!这是一个很好的解决方案,但并不总是有效。如果执行clean任务,然后运行testDebug,则会失败。基本上,开发人员需要知道他必须在testDebug之前运行assembleDebug任务。你们有什么改进的建议吗?使用AndroidStudio 1.5和android插件1.5.0,将json文件放在这里
    src/test/resources/test.json
    并将其引用为
    classLoader.getResource(“test.json”)
    。不需要对渐变进行修改。
    资源中的嵌套文件夹也在工作。答案不完整。什么是类加载器?这行代码放在哪里?您可以对返回的结果做什么?。请提供更完整的代码-1阅读Kotlin中的
    /src/test/resources/file.txt
    TestClassName::class.java.getResource(“/file.txt”)!!。readText()
    这对我不起作用,请看我的问题,当我从“src/test/res”改为“src/test/resources”时,这对我起作用了。使用AndroidStudio 2.0RC3,gradle:2.0.0-RC3工作正常。但测试是得到的
    android {
       testOptions {
          unitTests {
             includeAndroidResources = true
          }
        }
    }
    
     this.getClass().getClassLoader().getResourceAsStream(fileName);