Gradle - 为另一个模块的测试添加依赖项

时间:2016-01-05 01:46:30

标签: android gradle build android-gradle

我有一个多模块gradle项目,如下所示:

Parent
|--server
|--application (android module)
+--common

服务器测试依赖于通用模块测试。为此,我添加了

testCompile files(project(':common').sourceSets.test.output.classesDi
compileTestJava.dependsOn tasks.getByPath(':common:testClasses')

并且效果很好。不幸的是,当我试图对同样依赖于公共模块测试的应用程序模块做同样的事情时,它也行不通。它失败了:

Build file 'application\build.gradle' line: 103
A problem occurred evaluating project ':application'.
 Could not find property 'sourceSets' on project ':common'

谷歌搜索后我也尝试了

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

但失败了另一个例外:

Project application: Only Jar-type local dependencies are supported. Cannot handle: common\build\classes\test

有关如何解决此问题的任何想法?

5 个答案:

答案 0 :(得分:16)

在本文中,有几种方法可以解决导入测试类的问题。 https://softnoise.wordpress.com/2014/09/07/gradle-sub-project-test-dependencies-in-multi-project-builds/我使用的是:

共享模块中的代码:

task jarTest (type: Jar) {
    from sourceSets.test.output
    classifier = 'test'
}

configurations {
    testOutput
}

artifacts {
    testOutput jarTest
}

模块中的代码取决于共享模块: dependencies{ testCompile project(path: ':common', configuration: 'testOutput') }

它似乎也有一个插件! https://plugins.gradle.org/plugin/com.github.hauner.jarTest/1.0

答案 1 :(得分:3)

遵循sakis的方法,这应该是您需要从Android平台的另一个项目获得测试所需的配置(为调试变体完成)。 共享模块:

task jarTests(type: Jar, dependsOn: "assembleDebugUnitTest") {
    classifier = 'tests'
    from "$buildDir/intermediates/classes/test/debug"
}
configurations {
    unitTestArtifact
}
artifacts {
    unitTestArtifact jarTests
}

您的模块:

dependencies {
    testCompile project(path: ":libName", configuration: "unitTestArtifact")
}

答案 2 :(得分:2)

我认为您可以使用 gradles java test fixtures。这将自动创建一个 testFixtures 源集,您可以在其中编写要重复使用的测试。

<块引用>

测试装置被配置为:

  • 他们可以看到主要的源集类
  • 测试源可以看到测试装置类

例如,如果您在公共模块中有某个类:

public class CommonDto {
    private final Long id;
    private final String name;

    // getters/setters and other methods ...
}
    

然后在 common 模块中,您可以写入 src/testFixtures/java 以下实用程序:

public class Utils {
    private static final CommonDto A = new CommonDto(1, "A");
    private static final CommonDto B = new CommonDto(2, "B");

    public static CommonDto a() { return A; }

    public static CommonDto b() { return B; }
}

然后在您的其他模块中,您可以添加它以重用 Utils

dependencies {
    // other dependencies ...
    testImplementation(testFixtures(project(":common")))
}

所有这些在我最初提供的文档中都有更好的解释。在创建它之前,您需要考虑一些细微差别,以免将测试类泄漏到生产中。

答案 3 :(得分:0)

我知道这是一个老问题,但是以下博客中提到的解决方案可以很好地解决该问题,而不是一种破解或临时解决方法: Shared test sources in Gradle multi-module project

另外,您应该注意,他在最后一段提到,您需要在IntelliJ设置中启用为每个源集创建单独的模块。但它也可以正常工作,而无需使用该选项。可能是由于最近IntelliJ版本的更改所致。

答案 4 :(得分:0)

droidpl提到的 Android + Kotlin 解决方案如下:

task jarTests(type: Jar, dependsOn: "assembleDebugUnitTest") {
    getArchiveClassifier().set('tests')
    from "$buildDir/tmp/kotlin-classes/debugUnitTest"
}

configurations {
    unitTestArtifact
}

artifacts {
    unitTestArtifact jarTests
}

将要使用依赖项的项目的等级:

testImplementation project(path: ':shared', configuration: 'unitTestArtifact')