【问题标题】:Mark Gradle source folder as test source in IntelliJ在 IntelliJ 中将 Gradle 源文件夹标记为测试源
【发布时间】:2017-06-23 04:38:51
【问题描述】:

我在 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 无法将源文件夹识别为测试源。

我尝试像这样添加它们(在subprojects 内):

idea {
    module {
        testSourceDirs += file('src/integrationTest/java')
    }
}

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

如何在 Gradle 中正确配置?

我在 Ubuntu 16.04 上使用 IntelliJ 2016.1.3 和 Gradle 2.14.1

【问题讨论】:

  • 您在进行更改后如何重新生成您的 IDEA 文件?这应该可以工作(我已经在本地测试过)-尝试运行$ ./gradlew cleanIdea idea
  • 我宁愿有一个 Gradle 不生成我的 Idea 配置的解决方案,因为在同一个 repo 中也有非 Gradle 项目。
  • @tddmonkey 您的解决方案确实生成了正确的 .iml 文件,但 IntelliJ 没有使用它们。你知道我是怎么做到的吗? Java 项目是另一个项目的子文件夹,而该项目是主项目,带有一个用于配置的.idea 文件夹。
  • 你是怎么打开的?我一般做$ ./gradlew cleanIdea idea; open <name_of_project>.ipr

标签: java intellij-idea gradle integration-testing


【解决方案1】:

你需要确保测试源是这个包的唯一来源

idea {
    module {
        sourceDirs -= file('src/integrationTest/java')
        testSourceDirs += file('src/integrationTest/java')
    }
}

然后您需要gradle cleanIdea idea 重新创建 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 插件现在可以正确标记来源。

【讨论】:

  • 不,这不会改变任何事情。
  • @Jorn 尝试像我在编辑中建议的那样更改它,不确定您的 file() 但我倾向于指定源的整个路径。你是在 Gradle 中使用 Idea 插件还是在 IntelliJ IDE 中使用 Gradle 集成?
  • @bharal,当时它确实适用于其他人和我,所以请详细说明,同时使用带有 IntelliJ gradle 插件的 gradle 插件会在少数情况下产生混合和混乱。说it doesn't work 看起来不像是程序员的做法。
  • @LazerBanana idk 你想让我说什么 - 这不起作用,intellij 将文件夹标记为 src,而不是测试 src。我正在使用 gradle idea 插件 - apply plugin: 'idea' 而 intellij 有 gradle 插件。
  • @bharal 所以这意味着您的 IntelliJ 插件可能会覆盖由 idea gradle 插件更改的自定义 iml。如果您同时使用这两种方法,那将无法正常工作。但我对你的 -1 没问题;)我会添加这个解释给其他人看。谢谢
【解决方案2】:

来自 JetBrains 问题:

https://youtrack.jetbrains.com/issue/IDEA-151925#comment=27-2355076

apply plugin: 'java'
sourceSets {
  integrationTest
}
apply plugin: 'idea'
idea {
  module {
    testSourceDirs += project.sourceSets.integrationTest.java.srcDirs
    testSourceDirs += project.sourceSets.integrationTest.resources.srcDirs
  }
}

【讨论】:

  • 这不起作用。可惜没有人能真正提供帮助,对吧?
  • 确实如此,但就像我说的那样,您的 IntelliJ gradle 集成很可能会接管。
  • 如果你有 annotationProcessor 依赖就不行了。
  • 对我来说效果很好。如果它对您不起作用,请将您的 idea {module 在文件中移到更高的位置,以便它首先运行。
猜你喜欢
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2017-01-16
相关资源
最近更新 更多