在单元测试中通过Gradle排除罐子

时间:2018-10-12 21:55:08

标签: java android gradle

我正在使用fileTree()包含另一个项目中的一些本地构建的库:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    ...
}

对于单元测试,我想使用自己的模拟类而不是这些jar。我该如何testImplementation配置使用那些jar文件,而是使用源层次结构之外的类似名称的类?

2 个答案:

答案 0 :(得分:0)

默认为the testImplementation configuration extends from the implementation one,因此添加到implementation的每个依赖项都将出现在testImplementation中。

所以最好的选择是将这些特定的依赖项声明为不同的配置,我们将其称为extraDeps,然后将其添加到compileClasspath配置中:

configurations {
    extraDeps
    compileClasspath.extendsFrom(extraDeps)
}

dependencies {
    extraDeps fileTree(dir: 'libs', include: ['*.jar'])
}

这为您提供以下优点:

  • 编译和测试之间的共享依赖关系仍然可以在implementation
  • 可以清楚地识别特殊依赖项,因为它们处于自己的配置中
  • 编译类路径可以满足所有需求
  • 测试类路径没有看到特殊的罐子

答案 1 :(得分:0)

就我而言,我需要包括aar来实现,并用jar替换它以进行单元测试。 Gradle can't exclude jar files,所以我找到了不同的解决方案。

假设我在文件夹MyProject中有一个Android项目。因此,必须有文件MyProject/build.gradleMyProject/app/build.gradle。 我将<my-dependency>.aar文件和<my-test-dependency>.jar文件放入MyProject/app/libs目录。然后,将该目录作为本地存储库添加到MyProject/build.gradle文件中:

allprojects {
    repositories {
        ...
        flatDir {
            dirs 'libs'
        }
    }
}

现在我可以按名称包括和排除我的aar:

configurations.testImplementation {
    exclude module: '<my-dependency>'
}

dependencies {
    implementation(name: '<my-dependency>', ext:'aar')
    
    testImplementation(name: '<my-test-dependency>', ext:'jar')
    // fileTree also should work, i.e.:
    // testImplementation fileTree(dir: 'libs', include: ['*.jar'])
}