在Gradle环境中的JUnit测试中访问文件

时间:2014-11-20 18:15:18

标签: java android junit

现在我有一个拥有测试类的Java库。在那个课程中,我想访问位于我硬盘上的一些文件。

build.gradle看起来像这样:

apply plugin: 'java'

dependencies {
    testCompile 'junit:junit:4.11'
}

我的文件位于java_lib/src/test/assets/file.xml下,Java类位于java_lib/src/test/java/<package_name>.java

因此我执行

final InputStream resourceAsStream = this.getClass().getResourceAsStream("assets/file.xml");

不幸的是我回来了。我做错了什么?

5 个答案:

答案 0 :(得分:14)

要让事情滚动,您需要将以下内容添加到gradle文件中:

task copyTestResources(type: Copy) {
    from "${projectDir}/src/test/resources"
    into "${buildDir}/classes/test"
}
processTestResources.dependsOn copyTestResources

它的基本功能是将src/test/resource目录中的所有文件复制到build/classes/test,因为this.getClass().getClassLoader().getResourceAsStream(".")指向build/classes/test

Google已知道issue,他们希望在Android Studio 1.2中修复它(因为它们需要IntelliJ14,看起来它将包含在Android Studio 1.2中)

答案 1 :(得分:7)

尝试将file.xml放在src/test/resources下并使用this.getClass().getResourceAsStream("file.xml")(不带文件夹前缀)

问题似乎是assets文件夹不是测试运行时类路径的一部分,因此this.getClass().getResourceAsStream("assets/file.xml")无法按预期解析路径。

默认情况下,Gradle java项目中的test资源文件夹为src/test/resources(与Maven java项目相同)。如果您愿意,可以在项目的assets文件中添加此文件夹,将其覆盖到build.gradle文件夹:

sourceSets.test {
    resources.srcDirs = ["src/test/assets"]
}

答案 2 :(得分:3)

build.gradle中,添加以下内容:

sourceSets.test {
    resources.srcDirs = ["src/test"]
}

在您的代码中,像这样访问您的资源:

getClass().getClassLoader().getResourceAsStream("assets/file.xml"));

适合我。

答案 3 :(得分:0)

感谢您指出Google issue我一整天都在寻找这个......

在&#34; Android Studio 1.1 RC 1&#34; (gradle构建工具1.1.0-rc1)不需要将工作添加到gradle文件中,但是你必须从gradle任务菜单(或命令提示符)执行测试!

答案 4 :(得分:0)

这对我有用(三年后,gradle 4.10)

subprojects {   
  junitPlatformTest.dependsOn processTestResources
}