Java 在IntelliJ中将Gradle源文件夹标记为测试源

Java 在IntelliJ中将Gradle源文件夹标记为测试源,java,intellij-idea,gradle,integration-testing,Java,Intellij Idea,Gradle,Integration Testing,我在gradle中设置了一个集成测试源文件夹,如下所示: subprojects { apply plugin: 'java' apply plugin: 'idea' sourceCompatibility = 1.8 configurations { integrationTestCompile.extendsFrom testCompile integrationTestCompileOnly.extendsFrom in

我在gradle中设置了一个集成测试源文件夹,如下所示:

subprojects {
    apply plugin: 'java'
    apply plugin: 'idea'

    sourceCompatibility = 1.8

    configurations {
        integrationTestCompile.extendsFrom testCompile
        integrationTestCompileOnly.extendsFrom integrationTestCompile
        integrationTestCompileOnly.extendsFrom testCompileOnly
        integrationTestRuntime.extendsFrom testRuntime
    }

    sourceSets {
        integrationTest {
            java {
                compileClasspath += main.output + test.output
                runtimeClasspath += main.output + test.output
                srcDir file('src/integrationTest/java')
            }
            resources.srcDir file('src/integrationTest/resources')
        }
    }

    task integrationTest(type:Test) {
        testClassesDir = sourceSets.integrationTest.output.classesDir
        classpath = sourceSets.integrationTest.runtimeClasspath
        outputs.upToDateWhen { false }
    }
}
对于执行测试来说,这工作得非常好,但它会导致IntelliJ的检查出现问题,这可能会改变测试代码的行为。IntelliJ无法将源文件夹识别为测试源

我试着这样添加它们(在
子项目中
):

但这毫无帮助。我还尝试手动将它们标记为测试源(上下文菜单->将目录标记为->测试源根),但IntelliJ很快将其覆盖回正常的源根

如何在Gradle中正确配置此功能


我在Ubuntu 16.04上使用IntelliJ 2016.1.3和Gradle 2.14.1,您需要确保测试源是该软件包的唯一源

idea {
    module {
        sourceDirs -= file('src/integrationTest/java')
        testSourceDirs += file('src/integrationTest/java')
    }
}
然后您需要
gradle cleaneidea
重新创建IntelliJ文件

使用来自gradle的idea插件时,请确保您没有使用IDE gradle集成,如果集成处于打开状态,则对iml文件的自定义更改很可能与IDE发生冲突

sourceSets {
    integrationTest {
        java {
            compileClasspath += main.output + test.output
            runtimeClasspath += main.output + test.output
            srcDir "$projectDir/src/integrationTest/java"
        }
        resources.srcDir "$projectDir/src/integrationTest/resources"
    }
}
编辑:Gradle 4.7 Idea插件现在正确标记源代码。

来自JetBrains发行版:


在进行更改后,您是如何重新生成IDEA文件的?这应该行得通(我已经在本地进行了测试)-试着运行
$./gradlew cleanIdea
我希望有一个解决方案,Gradle不生成我的idea配置,因为在同一个repo中也有非Gradle项目。@tddmonkey您的解决方案确实生成了正确的
.iml
文件,但IntelliJ没有使用它们。你知道我是怎么做到的吗?Java项目是另一个项目的子文件夹,该项目是主项目,其中包含一个用于配置的
.idea
文件夹。您如何打开它?我通常做
$./gradlew cleaneidea想法;open.ipr
不,这不会改变任何东西。@Jorn尝试按照我在编辑中的建议进行更改,但不确定您的
文件()
,但我倾向于指定源文件的整个路径。你是在Gradle中使用Idea插件还是在IntelliJ IDE中使用Gradle集成?@bharal,这在当时对其他人和我都有效,因此请详细说明,同时使用带有IntelliJ Gradle插件的Gradle插件会在少数情况下造成混淆。说
它不起作用
似乎不像是程序员的方法。@LazerBanana告诉我你想说什么-这不起作用,intellij将文件夹标记为src,而不是test src。我正在使用gradle idea插件-
应用插件:“idea”
,intellij有gradle插件。@bharal因此这意味着您的intellij插件可能会覆盖由idea gradle插件更改的自定义iml。如果你同时使用这两种方法,这就是它不起作用的原因。但是我同意你的-1;)我将补充这一解释,让其他人看到。谢谢这不管用。很遗憾,idea中没有人能真正提供帮助,是吗?确实如此,但正如我所说,IntelliJ gradle集成最有可能接管。如果您有
annotationProcessor
依赖项,它就不起作用。
sourceSets {
    integrationTest {
        java {
            compileClasspath += main.output + test.output
            runtimeClasspath += main.output + test.output
            srcDir "$projectDir/src/integrationTest/java"
        }
        resources.srcDir "$projectDir/src/integrationTest/resources"
    }
}
apply plugin: 'java'
sourceSets {
  integrationTest
}
apply plugin: 'idea'
idea {
  module {
    testSourceDirs += project.sourceSets.integrationTest.java.srcDirs
    testSourceDirs += project.sourceSets.integrationTest.resources.srcDirs
  }
}