测试和编译对Gradle的依赖性不同

时间:2018-08-23 13:52:54

标签: java android testing gradle dependencies

我正在使用Android / Gradle依赖系统来解决此问题

  1. 我有一个相当复杂的具有某些API的JAR库-说other.jar
  2. 这个other.sdk完全不在我的控制范围内
  3. 此other.sdk仅在真实电话上工作
  4. 我需要编写要在Jenkins上执行的jUnit测试(不附带任何真实的电话)
  5. 因此,我编写了另一个名为say otherMock.jar的JAR文件
  6. 此otherMock.jar具有与other.jar完全相同的API

现在,我需要在build.gradle文件中执行以下操作:

...

dependencies {
    ...
    testCompile files('libs/otherMock.jar')
    debugCompile files('libs/other.jar')
    releaseCompile files('libs/other.jar')
    ...
}

...

不幸的是,那时Gradle似乎在我的测试版本中同时包含了other.jar和otherMock.jar。

我确实了解,对于大多数构建(包括我以前的所有构建),这是完全理想的行为。

但是对于我的特殊情况,这是一个问题。

所以我需要(例如)这样的东西:

...
dependencies {
    if(<I failed to realize which condition to write here to learn it is going to be a test>) {
        testCompile ...
    } else {
        debugCompile ...
        releaseCompile ...
    }
}

或更佳:

...
dependencies {
    testCompile ...
    debugCompile ... {
        exclude <when test build - what to write here?>
    }
}
...

我尽力实现了如何配置Gradle来执行我在这里需要的操作,但是我失败了:(

另一方面,我不敢相信Gradle不够灵活地实现这一目标。我希望对我来说太难了:) ...

请不要给我建议:

  • 在运行测试时包装other.jar并注入模拟变量(我知道这是可能的,但很多额外的工作对我来说没有意义)
  • 将真实电话连接到我的Jenkins(我无法做到这一点,因为我无法在真实设备上物理访问Jenkins虚拟机+,所以我根本无法控制模拟操作)
  • 应用诸如嘲笑之类的其他嘲笑机制-我也尝试过这样做,但是other.jar库没有遵循良好的设计原则,因此很难以标准方式进行嘲笑-我仍然没有尝试过powermock,但是再次这样做是没有意义的我尝试是否可以成功解决依赖项问题

1 个答案:

答案 0 :(得分:0)

您可以使用Gradle configurationsGradle test定义自定义配置,并将其从测试任务类路径中排除:

configurations {
   other.extendsFrom compile //latter is parent for both debugCompile and releaseCompile
}

test {
   classpath -= configurations.other
}


dependencies {
   testCompile files('libs/otherMock.jar')
   other files('libs/other.jar')
}