使用Gradle构建从Eclipse运行JUnit测试时的类路径问题

时间:2013-09-30 18:41:18

标签: eclipse junit gradle

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

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

这是build.gradle的相关部分:

  

依赖{       testCompile group:'com.mycompany',name:'MyConfigFile',version:'0.0.0 + dirty',ext:'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更改为编译,看看是否有所作为,但它没有改变任何东西(也许有说服力,我的.classpath没有XML文件的任何条目,即使选择编译配置。)

有没有人知道如何使这项工作?我只是错过了一些显而易见的事情吗?

1 个答案:

答案 0 :(得分:1)

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