导入到IntelliJ 14的Gradle中设置的自定义源

Dan*_*iel 7 intellij-idea gradle intellij-14

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

使用Gradle在命令行上构建项目,我能够成功运行集成测试.另一方面,当在IntelliJ内部运行时,我有两个问题:

1)由于集成测试中依赖于无法解析的第三方库(commons-collections),因此IntelliJ内部编译失败.

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

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

文件结构如下所示:

src
  integration-test
    java
    resources
  main
    java
    resources
  test
    java
    resources
build.gradle
Run Code Online (Sandbox Code Playgroud)

和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
Run Code Online (Sandbox Code Playgroud)

任何关于如何使这项工作的想法将非常感激.

Gradle分发中提供了完整的Gradle示例项目,位于samples/java/withIntegrationTests下

Rad*_*dim 8

您需要告诉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 ]
  }
}
Run Code Online (Sandbox Code Playgroud)

更多内容见http://www.gradle.org/docs/current/dsl/org.gradle.plugins.ide.idea.model.IdeaModule.html


编辑反映丹尼尔的评论: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
Run Code Online (Sandbox Code Playgroud)