Gradle 个测试从 XML 个文件中读取

Gradle tests read from XML files

我的 junit4 测试用例从 XML 文件中读取,这些文件位于目录 "src/myTest/java/data" 下我的主测试源文件夹下。

当我执行我的测试时,我得到文件未找到异常,因为它不知道这个数据文件夹。包含这些 XML 文件的最佳方式是什么,以便在我执行测试时,gradle 能够获取这些数据文件的位置。

谢谢

更新

我将数据文件移动到资源目录,现在我可以在我的测试执行中指定我的资源目录。

task myTests(type: Test) {
    testClassesDir = sourceSets.myTests.output.classesDir
    classpath = sourceSets.myTests.runtimeClasspath + sourceSets.myTests.resources
}

但是当我编译我的测试时,它似乎没有将资源输出到 'build/resources/myTests' 中,我有一种感觉,这就是为什么我需要在类路径中指定资源文件夹以包含 'sourceSets.myTests.resources'否则它已经从构建路径中获取了它。

sourceSets {
    myTests {
        java {
            compileClasspath += main.output + test.output
            runtimeClasspath += main.output + test.output
        }
        resources {
            include "*.xml"
            output.resourcesDir 'build/resources/myTests'
        }
    }
}

task myTest(type: Test) {
    testClassesDir = sourceSets.myTests.output.classesDir
    classpath = sourceSets.myTests.runtimeClasspath + sourceSets.myTests.resources
}

Gradle 默认情况下需要 src/test/resources/ 的测试资源。如果您有 src/test/resources/data/pluto.xml

这样的文件
ClassLoader classLoader = CommonResourceUtil.class.getClassLoader();
InputStream stream = classLoader.getResourceAsStream( "data/pluto.xml" );

可能有更简单的方法来获取 ResourceAsStream。重点是 src/test/resources/ 在测试的类路径上,因此您可以使用那里的相对路径。

我确定有更长的方法来配置 gradle 测试任务以将您自己的目录放在类路径中,但这会让每个人后来都想知道为什么它在那里而不只是在默认位置.我建议您将测试文件移至 src/test/resources/ 并从那里开始计算。

默认情况下,gradle 假定您在执行测试时使用 Apache Standard Directory Layout. This layout includes a folder src/test/resources, whose contents are put on the classpath 组织了项目。

因此,在测试中包含这些 xml 文件的最简单方法是遵循该布局并将它们放在 src/test/resources 中。根据您配置构建的方式,src/smokeTest/resources 也可能有效。

然后您可以按照 this 教程中所述访问资源。基本上,访问此类文件的最简单方法如下(从教程中复制):

public InputStream getResourceAsStream(String name) {
  name = resolveName(name);
  ClassLoader cl = getClassLoader();
  if (cl==null) {
    return ClassLoader.getSystemResourceAsStream(name); // A system class.
  }
  return cl.getResourceAsStream(name);
}

public java.net.URL getResource(String name) {
  name = resolveName(name);
  ClassLoader cl = getClassLoader();
  if (cl==null) {
    return ClassLoader.getSystemResource(name);  // A system class.
  }
  return cl.getResource(name);
}

你也可以试试这个

sourceSets {
    main {
        output.resourcesDir = ['src/test/resources', 'src/smokeTest/java/data']
    }
}