2

我有一个 Gradle 项目,它声明了对 XML 数据文件的仅测试依赖项,然后从类路径加载文件。当我从命令行直接在 Gradle 中运行测试时,一切正常,但是当我运行“gradlew eclipse”时,在 Eclipse 中刷新项目,然后尝试从 Eclipse 运行测试(Debug As -> JUnit Test),测试失败,因为它无法找到 XML 文件,并且类路径(从“调试”视图中进程的“属性”上下文菜单项访问)没有显示 XML 文件包含在类路径中的指示。

我看到的行为与http://gradle.1045684.n5.nabble.com/gradle-junit-tests-resources-and-classpath-td4418753.html#a4420758有一些共性,但肖恩的问题是相反的:他的测试在 Ant 下正常运行(但他从未提到尝试直接从 Eclipse JUnit 插件运行),但在 Gradle 下却没有。

这是 build.gradle 的相关部分:

依赖项 { testCompile 组:'com.mycompany',名称:'MyConfigFile',版本:'0.0.0+dirty',分机:'xml'}

因为 URLClasspathLoader 可以直接从文件系统加载的唯一资源是 JAR,所以我使用以下静态方法在类路径中搜索与我需要加载的文件名匹配的文件:

public static String getFullPathForResourceDirectlyOnClasspath(String nameFragment) {
    ClassLoader cl = ClassLoader.getSystemClassLoader();
    for (URL url: ((URLClassLoader)cl).getURLs()){
        String fullPath = url.getFile();
        if (fullPath.contains(nameFragment)) {
            return fullPath;
        }
    }
    return null;
}

我称该方法如下:

getFullPathForResourceDirectlyOnClasspath("/MyConfigFile-");

当我从 Gradle(“gradlew build”)运行该代码时,它会找到该文件并且我的测试成功。当我从 Eclipse(Debug As -> JUnit Test)运行它时,它无法在类路径上找到该文件(因为 Eclipse JUnit 插件没有将它放在那里)并且该调用返回 null。

我已经尝试将配置从 testCompile 更改为 compile 以查看是否有所不同,但它没有改变任何东西(也许很明显,即使编译配置是,我的 .classpath 也没有 XML 文件的任何条目选择)。

有谁知道使这项工作的方法?我只是错过了一些应该很明显的东西吗?

4

1 回答 1

1

您似乎在滥用类路径将单个参数(XML 文件的绝对文件路径)传递给测试。相反,您应该以正确的方式将 XML 文件放在(测试)类路径中(它需要进入类路径中列出的目录或 Jar 文件)并正确加载它(例如使用getClass().getClassLoader().getResource("some/resource.xml")),或者通过测试的文件路径作为系统属性。自然地,后者将更难在不同的环境下工作(比如 Gradle 构建和 IDE)。

于 2013-09-30T19:20:01.500 回答