8

我试图让 Gradle (2.1) 和 IntelliJ (14.0.2) 玩得很好。具体来说,我已经将一个包含用于集成测试的单独源集的示例 Gradle 项目导入 IntelliJ。

该项目在命令行上使用 Gradle 构建良好,并且我能够成功运行集成测试。另一方面,在 IntelliJ 中运行时,我有两个问题:

1) 在 IntelliJ 中编译失败,因为集成测试依赖于无法解析的第三方库(commons-collections)。

2)如果我删除上面的依赖并编译,我无法在 IntelliJ 中运行集成测试。我收到以下错误消息:

没有找到给定的测试包括:[org.gradle.PersonIntegrationTest.canConstructAPersonWithAName]

文件结构如下所示:

src
  integration-test
    java
    resources
  main
    java
    resources
  test
    java
    resources
build.gradle

和 build.gradle:

apply plugin: 'java'

repositories {
    mavenCentral()
}

sourceSets {
    integrationTest {
        java.srcDir file('src/integration-test/java')
        resources.srcDir file('src/integration-test/resources')
    }
}

dependencies {
    testCompile 'junit:junit:4.11'
    integrationTestCompile 'commons-collections:commons-collections:3.2'
    integrationTestCompile sourceSets.main.output
    integrationTestCompile configurations.testCompile
    integrationTestCompile sourceSets.test.output
    integrationTestRuntime configurations.testRuntime
}

task integrationTest(type: Test, dependsOn: jar) {
    testClassesDir = sourceSets.integrationTest.output.classesDir
    classpath = sourceSets.integrationTest.runtimeClasspath
    systemProperties['jar.path'] = jar.archivePath
}

check.dependsOn integrationTest

任何关于如何完成这项工作的想法将不胜感激。

完整的 Gradle 示例项目在 Gradle 发行版中,位于 samples/java/withIntegrationTests

4

1 回答 1

9

您需要告诉 IDEA 将integrationTest配置中的条目作为 TEST 依赖项映射到您的项目中。我不确定您是否也需要添加源根目录。重要的部分是:

idea {
  module {
    //and some extra test source dirs
    testSourceDirs += file('some-extra-test-dir')
    generatedSourceDirs += file('some-extra-source-folder')
    scopes.TEST.plus += [ configurations.integrationTest ]
  }
}

更多信息在http://www.gradle.org/docs/current/dsl/org.gradle.plugins.ide.idea.model.IdeaModule.html


编辑以反映 Daniel 的评论:generatedSourceDirs是 Gradle 2.2+。要设置测试任务,您将使用类似的任务

task integTest(type: Test) {
    description = 'Runs the integration tests.'
    group = 'verification'
    testClassesDir = sourceSets.integTest.output.classesDir
    classpath = sourceSets.integTest.runtimeClasspath
    reports.junitXml.destination = file("${project.testResultsDir}/$name")
    reports.html.destination = file("${project.reporting.baseDir}/$name")
    shouldRunAfter test
}
check.dependsOn integTest
于 2014-12-15T16:40:09.063 回答