【问题标题】:Maven - How to unit test a project dependent on another project?Maven - 如何对依赖于另一个项目的项目进行单元测试?
【发布时间】:2019-01-01 18:03:15
【问题描述】:

我知道这个问题已经被问过很多次了,但是我读过的方法对我不起作用。我试过this,但还是不行。

我有一个依赖于另一个子项目(B) 的子项目(A)。

两个子项目都包含在父目录中,父目录中的 pom.xml(将 A 和 B 声明为模块)位于各自的子目录中。

使用 maven-assembly-plugin 编译和安装项目可以正常工作,但是当我尝试测试 A 时,它无法识别 B 中的类。 我试过先安装它然后测试,但它仍然找不到类。我错过了什么?

错误:

 [ERROR] Failed to execute goal
 org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile
 (default-testCompile) on project (A)

[ERROR] TestService.java:[8,17] cannot find symbol 

[ERROR]   symbol:   class **Model** (the class I'm referencing in B)

[ERROR]   location: class **TestService** 
(test in A that tests the class in ../service/src/main/java/Service.java)

编辑:
/项目
--/service(这取决于模型;这也是我要测试的)
---/src
----/主
-----/java
------/Service.java
----/测试
-----/java
------/TestService.java

--/model(独立)
---/src
----/主
-----/java
------/Model.java

--/entry(这取决于服务;整个项目的入口点)
--pom.xml (父 pom)

三个项目里面都有自己的pom.xml。

/model/pom.xml 不包含依赖项和插件

这里是父: 父/pom.xml

  ...
  <modules>
    <module>entry</module>
    <module>service</module>
    <module>model</module>
  </modules>

这里是条目:

 /service/pom.xml
        ...
    <parent>
        <groupId>com.some.project</groupId>
        <artifactId>project</artifactId>
        <version>xx</version>
    </parent>
    <artifactId>entry</artifactId>
    <packaging>jar</packaging>
    <version>xx</version>
    <name>entry</name>
    <build>
     ...
     <!--assembly plugin is declared here-->
    </build>
    <dependencies>
      <dependency>
      <groupId>com.some.project</groupId>
      <artifactId>service</artifactId>
      <version>xx</version>
      </dependency>
    </dependencies>

这里是服务:

/service/pom.xml
    ...
<parent>
    <groupId>com.some.project</groupId>
    <artifactId>project</artifactId>
    <version>xx</version>
</parent>
<artifactId>service</artifactId>
<packaging>jar</packaging>
<version>xx</version>
<name>service</name>
<dependencies>
  <dependency>
  <groupId>com.some.project</groupId>
  <artifactId>model</artifactId>
  <version>xx</version>
  </dependency>

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.12</version>
  <scope>test</scope>
</dependency>
</dependencies>

【问题讨论】:

  • 请显示代码或错误信息。

标签: java maven junit


【解决方案1】:

Maven 组装插件通常用于打包已经编译好的源码,所以这里不相关。

如果你有两个项目,A 和 B 并且 B 必须依赖于 A,你必须在 B 的 pom.xml 中定义一个依赖项(琐碎的东西):

<dependency>
  <groupId>YOUR_GROUP_ID</groupId>
  <artifactId>A</artifactId>
  <version>YOUR_VERSION</version>
</dependency>

这将指示 maven 在构建期间设置类路径。

现在,根据 A 和 B 的工件类型,maven 可以决定编译后的一些步骤,例如,如果 B 是 WAR,由于这种依赖关系,A 将包含在 B 的 WEB-INF/lib 文件夹中.

但一般来说,如果 A & B 是 jar,maven 不会将此信息仅用于编译/测试而不用于打包。

现在,maven 对不同阶段有不同的类路径:特别是,一个用于编译,一个用于单元测试。

因此,如果您想指定该依赖项仅用于测试,但不应被视为“编译”依赖项,则定义范围:

<dependency>
  <groupId>YOUR_GROUP_ID</groupId>
  <artifactId>A</artifactId>
  <version>YOUR_VERSION</version>
  <scope>test</scope>
</dependency>

如果您不指定任何范围,maven 将得出结论,编译和测试都需要依赖项,甚至可能需要打包,正如我之前解释的那样。

【讨论】:

  • 我已将其添加为依赖项,但 B 的测试类仍然找不到 A 中的类。我尝试使用“编译”范围和“测试”范围。
  • 您在 B 中引用的来自 A 的类是否存在于“src/test/java”而不是“src/main/java”中?你可以使用 A 的 src/main/java 中的类吗?
  • 我在 B 中提到的来自 A 的类在“src/main/java”中。它是 B 需要的模型类(B 是服务类),所以如果我想测试 B,我需要在 A 中实例化该类。(再次为清楚起见,在这种情况下,B 依赖于 A;B 是服务, A是模型)
  • 在这种情况下,它是一个完全被 maven 支持的用例,所以问题必须是纯技术问题,在 pom.xmls 中有一些错误的定义。我很害怕,没有实际的 pom-s 以及服务和模型的示例文件,在这里帮助你并不容易
  • 您是从父项目还是在项目 A 中运行 Maven?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多