所以我在一个模块中有一些类来帮助进行 Robolectric 风格的单元测试,我希望能够在我的一堆其他模块中共享这个模块。这个模块有它自己的单元测试,我已经将它设置为 apklib。我正在使用maven-android-plugin。问题似乎是它无法识别测试范围内的 apklib。是否有任何解决方法,或者我错过了什么?
我注意到的一件事是,如果我运行 command mvn install
,一切都会构建并且我的所有测试都运行良好,但如果我这样做mvn test
,它会说它找不到类。
所以我在一个模块中有一些类来帮助进行 Robolectric 风格的单元测试,我希望能够在我的一堆其他模块中共享这个模块。这个模块有它自己的单元测试,我已经将它设置为 apklib。我正在使用maven-android-plugin。问题似乎是它无法识别测试范围内的 apklib。是否有任何解决方法,或者我错过了什么?
我注意到的一件事是,如果我运行 command mvn install
,一切都会构建并且我的所有测试都运行良好,但如果我这样做mvn test
,它会说它找不到类。
Maven 有“反应器”这个概念,这只是对正在构建的项目列表的一个花哨的术语。在 Maven 构建的开始和结束时,Maven 打印出这个项目列表(使用/project/name
(XPath) 如果定义或groupId:artifactId
其他方式)。
对于反应器中的每个项目,Maven 维护一个已附加的工件列表。默认情况下,每个模块pom.xml
都是附加的,并且随着每个插件的运行,它们可以选择附加额外的工件。大多数插件不附加工件,以下是一些插件:
jar:jar
创建一个.jar
并将其附加为主要工件(除非您在配置中指定分类器)war:war
创建一个.war
并附加它source:jar
创建.jar
源 Java 代码并附加一个分类器source
javadoc:jar
创建一个.jar
JavaDocs 并附加一个分类器javadoc
android:apklib
创建一个.apklib
工件并将其附加为主要工件还有一个默认的主工件(这是被 jar:jar 替换的那个),它实际上是一个目录而不是文件,因此它不会被安装或部署到本地存储库缓存或远程存储库。
因此,当在反应器中,并且附加主工件的插件尚未运行(在您的情况下android:apklib
),并且另一个插件要求主工件时,它将被赋予目录${project.build.outputDirectory}
。如果在附加主要工件之后,则将提供该主要工件。
test
阶段发生在阶段之前package
,因此将传递目录而不是.apklib
.
在多模块项目中事情变得更加复杂(这是我的长篇介绍应该帮助你的地方)
Maven 必须构建测试类路径。如果依赖项之一在反应器内,Maven 将使用附加到反应器的工件。否则它将使用本地缓存(必要时从远程存储库填充)。
当你跑
mvn test
在来自根的 multimdule 项目中,没有替换默认(基于目录的)工件,因此模块内类路径将指向目标/类目录(我们假设 android 插件知道如何处理此类测试...您发现它没有)。
当你跑
mvn package
或者
mvn install
然而,在同一个项目中,因为每个模块都按顺序完成其生命周期,所以所有依赖模块都将交换它们的.apklib
文件作为附加的工件。
这里的问题很可能是您的测试不适用于目录并且需要实际.apklib
文件。在这种情况下,您别无选择,只能将生命周期至少推到package
阶段。