首页 文章

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

提问于
浏览
7

我试图让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

和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下

1 回答

  • 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 ]
      }
    }
    

    更多内容在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
    

相关问题