1

所以我在一个模块中有一些类来帮助进行 Robolectric 风格的单元测试,我希望能够在我的一堆其他模块中共享这个模块。这个模块有它自己的单元测试,我已经将它设置为 apklib。我正在使用maven-android-plugin。问题似乎是它无法识别测试范围内的 apklib。是否有任何解决方法,或者我错过了什么?

我注意到的一件事是,如果我运行 command mvn install,一切都会构建并且我的所有测试都运行良好,但如果我这样做mvn test,它会说它找不到类。

4

1 回答 1

6

Maven 有“反应器”这个概念,这只是对正在构建的项目列表的一个花哨的术语。在 Maven 构建的开始和结束时,Maven 打印出这个项目列表(使用/project/name(XPath) 如果定义或groupId:artifactId其他方式)。

对于反应器中的每个项目,Maven 维护一个已附加的工件列表。默认情况下,每个模块pom.xml都是附加的,并且随着每个插件的运行,它们可以选择附加额外的工件。大多数插件不附加工件,以下是一些插件:

  • jar:jar创建一个.jar并将其附加为主要工件(除非您在配置中指定分类器)
  • war:war创建一个.war并附加它
  • source:jar创建.jar源 Java 代码并附加一个分类器source
  • javadoc:jar创建一个.jarJavaDocs 并附加一个分类器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阶段。

于 2013-01-29T21:29:19.403 回答