Gradle自定义测试sourceSet

Max*_*ime 5 testing intellij-idea gradle

我有一个gradle项目,并具有maintest作为sourceSets。

我确实希望test-main不成为测试源集的一部分。现在我遇到的问题是,在构建项目时,将test-main标记为Sources Root而不是Test Sources Root

这会导致编译错误,并且我必须手动将测试主体标记为所有子项目的“源测试根”。

我创建了一个任务,以强制将intellij标记为Sources Test Root,但似乎我做错了什么。

提示:

  • Intellij IDEA 2016.2
  • 摇篮2.14

谢谢,

subprojects {
  apply plugin: 'java' // all our projects are Java projects

  sourceCompatibility = '1.8'
  targetCompatibility = '1.8'

  tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
    options.warnings = false // There are too many :-(
  }

  configurations {
    testMainsCompile.extendsFrom testCompile
    testMainsRuntime.extendsFrom testMainsCompile
  }

  sourceSets {
    main {
      java {
        srcDirs = ['src']
      }
      resources {
        srcDirs = ['src']
      }
    }
    test {
      java {
        srcDirs = ['test']
      }
      resources {
        srcDirs = ['test']
      }
    }
    testMains {
      java {
        srcDirs = ['test-mains']
        compileClasspath = test.output + main.output + configurations.testMainsCompile
        runtimeClasspath = output + compileClasspath + configurations.testMainsRuntime
      }
      resources {
        srcDirs = ['test-mains']
      }
    }
  }

  // dummy task just to convince intellij idea that testMains is a test class folder
  task testMainsTest(type: Test) {
    testClassesDir = sourceSets.testMains.output.classesDir
    classpath += sourceSets.testMains.runtimeClasspath
  }

[...]

}
Run Code Online (Sandbox Code Playgroud)

Max*_*ime 7

我必须为idea插件指定:

subprojects {
  apply plugin: 'idea'

  idea {
    module {
      testSourceDirs += file('test-mains')
    }
  }
}
Run Code Online (Sandbox Code Playgroud)


Joe*_*man 6

我参加聚会确实迟到了,但有 11,000 次浏览,这可能对其他人有用。此时,我们已经到了 Gradle 6 和 IntelliJ 2020。要将并行测试文件夹链接到 Gradle 和 IntelliJ,您需要创建文件夹结构,然后声明几乎与上面完全相同的源集。源集告诉 IntelliJ 有关子模块的信息,因此它们在 IntelliJ 中显示为带有蓝色方块的文件夹。

Maxime 回答了他关于制作源文件夹测试源的问题,该问题由 idea 插件处理(尽管您也可以从文件夹的上下文菜单在 IntelliJ 中手动执行此操作)。

但是,他有一些这里没有提到的事情。

我可能会将资源源保留在 Java 源文件夹的旁边,而不是与它相同。通常,Gradle/Maven 应用程序的“java”旁边有“资源”。

关于文件夹名称的警告。Maxime 具有不同的源集名称和文件夹名称。我尝试过,我想要文件夹名称中的 - 。但当我尝试时,IntelliJ 在项目结构中有点偏离轨道,显示源集名称的红色内容源。可能只是我的问题,也许我还有其他问题:)

Maxime巧妙地扩展了testCompile来获取项目的compileClasspath,然后对runtimeClasspath使用相同的值。但是如果runtimeClasspath 在项目级别不同怎么办?我使用的 gradle snippit 直接从项目中获取它们(main 和 test 是项目中的默认子模块):

    testIntegration {
    java {
        compileClasspath += project.configurations.testCompileClasspath + main.output + test.output
        runtimeClasspath += project.configurations.testRuntimeClasspath + main.output + test.output
        srcDir file('src/testIntegration/java')
    }
    resources {
        srcDir file('src/testIntegration/resources')
    }
}
Run Code Online (Sandbox Code Playgroud)