我们如何跨Android库模块继承测试类?

我们如何跨Android库模块继承测试类?,android,android-gradle-plugin,Android,Android Gradle Plugin,我有一个Android Studio项目,有两个库模块:foo模块和bar模块。每个模块都实现了一个库,其中foo模块定义了一个策略接口和bar模块,这取决于foo模块并实现了这样的策略foo模块具有检测测试(foo模块/src/androidTest/)以使用存根策略实现测试其核心代码,bar模块应具有自己的检测测试 我在foo module/src/androidTest/中定义了一个AbstractTests类,它执行大部分实际测试。我在foo module/src/androidTest

我有一个Android Studio项目,有两个库模块:
foo模块
bar模块
。每个模块都实现了一个库,其中
foo模块
定义了一个策略接口和
bar模块
,这取决于
foo模块
并实现了这样的策略
foo模块
具有检测测试(
foo模块/src/androidTest/
)以使用存根策略实现测试其核心代码,
bar模块
应具有自己的检测测试

我在
foo module/src/androidTest/
中定义了一个
AbstractTests
类,它执行大部分实际测试。我在
foo module/src/androidTest/
中还有一个
StubTests
类,它扩展了
AbstractTests
并实现了必要的
abstracts
方法来完成测试用例(提供策略的实现等)。这一切都很好

bar-module/src/androidTest/
中,我创建了一个
BarStrategyTests
类,旨在镜像
StubTests
,但提供在
bar-module
中实现的策略。然而,
BarStrategyTests
无法看到
AbstractTests
,即使我在
build.gradle
文件中有
编译项目(“:foo module”)
,并且
bar module
中的主(非测试)类可以很好地与
foo module
中的主(非测试)类一起工作。照此,虽然
project()
依赖项处理常规代码,但它不处理
androidTest/
代码。我得到“错误:包com.commonware.foo.test不存在”

我还尝试添加了
androidTestCompile项目(':foo module')
,结果相同

模块之间共享仪器测试代码的方法是什么

暂时,我可以克隆
AbstractTests
,但这不是一个很好的长期解决方案


涵盖了普通Java的类似基础。有没有人尝试过这些选项并让它们用于Android仪器测试?第一个选项(将通用测试代码作为常规非测试代码移动到另一个模块中)似乎是可行的,但我不知道其他两个选项是否能与
com.android.library
插件而不是
java
插件配合使用不属于任何模块(包括aar)的一部分,它们不能通过对该模块的依赖关系使用。我也遇到了这个问题,通过创建
测试模块
并将所有必需的类放入其中(
src/main/java
)解决了这个问题。
因此,在您的例子中,您可以在这个模块中移动
AbstractTests
,并将这个模块用作
androidTestCompile
依赖项

如果我依赖于预打包的AAR,比如存储库工件,我肯定会看到需要做一些不同的事情。我原以为
compileproject(':foo module')
会匹配相应的源代码集——毕竟,这不是
compileproject,而是mainsourcesetplease(':foo module')
:-)我将暂时不讨论这个问题,看看其他人是否还有其他选择,但如果你的选择最终成为最佳选择,我不会感到震惊。谢谢你的帮助!注意,这种方法似乎需要多个附加模块。基本上,
foo模块
本身不能有任何测试。不仅
AbstractTests
必须移动到
foo module test common
,而且以前在
foo module
中的任何测试都必须移动到
foo module test
。否则,您将得到循环依赖项:
foo模块
foo模块测试公共
上具有
androidTestCompile
,在
foo模块
上具有
compile
<因此,代码>foo模块不能依赖于
foo模块测试公共
。这太痛苦了。好吧,你必须避免
foo模块
依赖于
foo模块测试公共
。一个选项是将所有测试从
foo module
移动到
foo module test common
,这样这个模块不仅包含
src/main/java
中的公共测试类,还包含
foo module
中的
foo module
测试。啊,好的一点。我没有想到这种组合。再次感谢@你能想出一个合适的解决方案吗?我面临着一个类似的问题,但我希望跨模块继承的“基本”测试UTIL依赖于
org.junit.
(例如测试规则)中的内容,这些内容在
main/java
中不起作用……您找到了实现这一点的方法吗?我也想为其他模块提供我的测试类,但很难共享资源。@karate:我使用的是公认答案中概述的方法。应该有更好的方法来实现这一点,而不是将所有测试类移动到它们自己的模块并从中扩展:(负责gradle的人应该让我们更容易扩展Android+Kotlin项目的测试类解决方案: