多项目testing依赖与gradle

我有一个多项目configuration,我想使用gradle。

我的项目是这样的:

  • 项目A

    • – > src/main/java
    • – > src/test/java
  • 项目B

    • – > src/main/java (取决于Project A上的src/main/java
    • – > src/test/java (取决于Project A上的src/test/java

我的项目B build.gradle文件是这样的:

 apply plugin: 'java' dependencies { compile project(':ProjectA') } 

compileJava任务很好,但compileTestJava不能编译项目A中的testing文件。

项目B中 ,您只需添加一个testCompile依赖项:

 dependencies { ... testCompile project(':A').sourceSets.test.output } 

用Gradle 1.7testing。

简单的方法是在ProjectB中添加显式的任务依赖项:

 compileTestJava.dependsOn tasks.getByPath(':ProjectA:testClasses') 

困难(但更清晰)的方法是为ProjectA创build额外的工件configuration:

 task myTestsJar(type: Jar) { // pack whatever you need... } configurations { testArtifacts } artifacts { testArtifacts myTestsJar } 

并为ProjectB添加testCompile依赖项

 apply plugin: 'java' dependencies { compile project(':ProjectA') testCompile project(path: ':ProjectA', configuration: 'testArtifacts') } 

我知道这是一个古老的问题,但我只是有同样的问题,花了一些时间搞清楚是怎么回事。 我正在使用Gradle 1.9。 所有的改变都应该在ProjectB的build.gradle

在ProjectB的testing中使用ProjectA中的testing类:

 testCompile files(project(':ProjectA').sourceSets.test.output.classesDir) 

要确保sourceSets属性可用于ProjectA:

 evaluationDependsOn(':ProjectA') 

要确保ProjectA中的testing类实际上存在,当您编译ProjectB时:

 compileTestJava.dependsOn tasks.getByPath(':ProjectA:testClasses') 

我最近自己也遇到过这个问题,而男人这是一个难以find答案的问题。

你所犯的错误是认为一个项目应该以导出它的主要工件和依赖的方式导出它的testing元素。

我个人获得了更多成功的是在Gradle开发一个新项目。 在你的例子中,我会命名它

项目A_Test – > src / main / java

我将把你目前在Project A / src / test / java中的文件放到src / main / java中。 使项目的任何testCompile依赖关系Project A_Test的编译依赖关系。

然后使Project A_Test成为Project B的testCompile依赖项。

从两个项目的作者的angular度来看,这是不合逻辑的,但是当你考虑像junit和scalatest这样的项目(和其他项目)时,我认为这是很有意义的。尽pipe这些框架与testing相关,在他们自己的框架中不被视为“testing”目标的一部分 – 他们产生了其他项目恰好在他们的testingconfiguration中使用的主要工件,你只是想遵循相同的模式。

试着做这里列出的其他答案对我个人来说(使用Gradle 1.9)不起作用,但是我发现我在这里描述的模式是一个更清洁的解决scheme。

新的基于testJar(支持敏捷依赖)解决scheme作为gradle插件提供:

https://github.com/hauner/gradle-plugins/tree/master/jartest

https://plugins.gradle.org/plugin/com.github.hauner.jarTest/1.0

从文档

如果你有一个多项目gradle构build你可能有子项目之间的testing依赖项(这可能暗示你的项目没有很好的结构)。

例如,假定一个项目,其中子项目B依赖于项目A和B,不仅对A具有编译依赖性,而且还具有testing依赖性。 为了编译和运行B的testing,我们需要一些来自A的testing助手类。

默认情况下,gradle不会从项目的testing构build输出中创buildjar构件。

这个插件添加了一个testArchivesconfiguration(基于testCompile)和一个jarTest任务来创build一个来自testing源集的jar(分类器testing添加到jar的名字)。 然后,我们可以在B中依赖A的testArchivesconfiguration(这也将包括A的传递依赖关系)。

在A中,我们将添加插件build.gradle:

apply plugin: 'com.github.hauner.jarTest'

在B中,我们引用testArchivesconfiguration,如下所示:

 dependencies { ... testCompile project (path: ':ProjectA', configuration: 'testArchives') } 

请阅读下面的更新。

在IntelliJ IDEA中出现JustACluelessNewbie类似的问题。 问题是依赖testCompile project(':core').sourceSets.test.output实际上意味着:“依靠gradle构build任务生成的类”。 所以如果你打开没有生成类的干净项目,IDEA将不会识别它们并报告错误。

为了解决这个问题,你必须在依赖于编译的类旁添加一个依赖于testing源文件的东西。

 // First dependency is for IDEA testCompileOnly files { project(':core').sourceSets.test.java.srcDirs } // Second is for Gradle testCompile project(':core').sourceSets.test.output 

您可以在模块设置 – >依赖关系(testing范围)中观察由IDEA识别的依赖关系

顺便说一句。 这不是很好的解决scheme,所以重构是值得考虑的。 Gradle本身只包含特殊的包含testing支持类的子项目。 请参阅https://docs.gradle.org/current/userguide/test_kit.html

更新2016-06-05更多我正在考虑提议的解决scheme,我更喜欢它。 这个问题很less:

  1. 它在IDEA中创build了两个依赖项。 有人指出另一个testing源来编译类。 IDEA认识到这些依赖关系是至关重要的。 您可以通过在模块设置 – >依赖项选项卡中更改依赖顺序来使用它。
  2. 通过声明这些依赖关系,您不必要地污染依赖关系结构。

那么更好的解决scheme是什么? 在我看来,它创build了新的自定义源集,并将共享类放入其中。 其实Gradle项目的作者是通过创buildtestFixtures源代码集来完成的。

要做到这一点,你只需要:

  1. 创build源集并添加必要的configuration。 检查Gradle项目中使用的脚本插件: https : //github.com/gradle/gradle/blob/master/gradle/testFixtures.gradle
  2. 在依赖项目中声明适当的依赖关系:

     dependencies { testCompile project(path: ':module-with-shared-classes', configuration: 'testFixturesUsageCompile') } 
  3. 将Gradle项目导入到IDEA,并在导入时使用“为源集创build单独的模块”选项。

在项目B中:

 dependencies { testCompile project(':projectA').sourceSets.test.output } 

似乎工作在1.7-RC-2

Fesler的解决scheme没有为我工作,当我试图build立一个Android项目(gradle 2.2.0)。 所以我不得不手动引用所需的类:

 android { sourceSets { androidTest { java.srcDir project(':A:).file("src/androidTest/java") } test { java.srcDir project(':A:).file("src/test/java") } } } 

其他一些答案导致错误的方式 – Gradle没有检测到来自其他项目的testing类,或者Eclipse项目导入时具有无效的依赖关系。 如果有人有同样的问题,我build议与:

 testCompile project(':core') testCompile files(project(':core').sourceSets.test.output.classesDir) 

第一行强制Eclipse将其他项目作为依赖关系链接,因此所有源都包含在内并且是最新的。 第二个允许Gradle实际查看源代码,而不会像testCompile project(':core').sourceSets.test.output那样导致任何无效的依赖项错误。