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

Nik*_*las 15 java junit android

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

build.gradle看起来像这样:

apply plugin: 'java'

dependencies {
    testCompile 'junit:junit:4.11'
}
Run Code Online (Sandbox Code Playgroud)

我的文件在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");

不幸的是我回来了.我究竟做错了什么?

Nik*_*las 15

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

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

它通常做的是复制的所有文件src/test/resource目录build/classes/test,因为this.getClass().getClassLoader().getResourceAsStream(".")build/classes/test.

谷歌已经知道这个问题,他们希望在Android Studio 1.2中修复它(因为他们需要IntelliJ14,看起来它将包含在Android Studio 1.2中)

  • 我在项目`上找不到'找不到属性'processTestResources'. (3认同)

Inv*_*row 7

试着将file.xmlsrc/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"]
}
Run Code Online (Sandbox Code Playgroud)

  • 对我不起作用.我仍然从`getResourceAsStream`得到null (4认同)

ToY*_*nos 5

build.gradle,添加这个:

sourceSets.test {
    resources.srcDirs = ["src/test"]
}
Run Code Online (Sandbox Code Playgroud)

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

getClass().getClassLoader().getResourceAsStream("assets/file.xml"));
Run Code Online (Sandbox Code Playgroud)

为我工作。