Android Studiounit testing:读取数据(input)文件

在unit testing中,如何从我的(桌面)文件系统上的json文件中读取数据,而不对path进行硬编码?

我想从文件中读取testinginput(对于我的parsing方法),而不是创build静态string。

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

取决于android-gradle-plugin版本:

1.版本1.5和更高版本:

只需将json文件放到src/test/resources/test.json并引用即可

 classLoader.getResource("test.json"). 

不需要gradle修改。

2.版本低于1.5 :(如果由于某种原因,以上解决scheme不起作用)

  1. 确保您至less使用Android Gradle插件版本1.1 。 按照链接正确设置Android Studio。

  2. 创buildtest目录。 把unit testing类放在java目录下,把你的资源文件放在res目录下。 Android Studio应该像下面这样标记它们:

    在这里输入图像描述

  3. 创buildgradle任务,将资源复制到classes目录中,以使其对classloader可见:

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

     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()); } 
  5. 全class或专业testing方法按Ctrl + Shift + F10运行unit testing。

让我知道,如果它适合你。 在我的情况下,所以如果你有任何问题随时问:)

对于本地unit testing(vs.testingtesting),可以将文件放在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中,我有很多testing资源的问题,所以为了清晰起见,我设置了一些testing。 在我的mobile (Android应用程序)项目中,我添加了以下文件:

 mobile/src/test/java/test/ResourceTest.java mobile/src/test/resources/test.txt mobile/src/test/resources/test/samePackage.txt 

testing类(所有testing通过):

 assertTrue(getClass().getResource("test.txt") == null); assertTrue(getClass().getResource("/test.txt").getPath().endsWith("test.txt")); assertTrue(getClass().getResource("samePackage.txt").getPath().endsWith("test/samePackage.txt")); assertTrue(getClass().getResource("/test/samePackage.txt").getPath().endsWith("test/samePackage.txt")); assertTrue(getClass().getClassLoader().getResource("test.txt").getPath().endsWith("test.txt")); assertTrue(getClass().getClassLoader().getResource("test/samePackage.txt").getPath().endsWith("test/samePackage.txt")); 

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

 data/src/test/java/test/ResourceTest.java data/src/test/resources/test.txt data/src/test/resources/test/samePackage.txt 

然后,所有上面的testing将失败,如果我从Android Studio执行它们,但他们传递命令行./gradlew data:test 。 为了解决这个问题,我使用了这个hack(在Groovy中)

 def resource(String path) { getClass().getResource(path) ?: // Hack to load test resources when executing tests from Android Studio new File(getClass().getClassLoader().getResource('.').path .replace('/build/classes/test/', "/build/resources/test$path")) } 

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

Android Studio 2.3,Gradle 3.3

如果你去运行 – >编辑configuration – > JUnit,然后select你的unit testing运行configuration,有一个“工作目录”设置。 这应该指向你的json文件。 请记住,这可能会打破其他testing。

在我的情况下,解决scheme是添加到gradle文件

 sourceSets { test.resources.srcDirs += 'src/unitTests/resources' } 

一切都被AS 2.3.1发现后

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