现在我有一个拥有测试类的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");
不幸的是我回来了。我做错了什么?
答案 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
}