Maven-如何对依赖于另一个项目的项目进行单元测试?

时间:2018-07-25 02:40:49

标签: java maven junit

我知道这个问题已经问过很多遍了,但是我读过的方法对我不起作用。我尝试了this,但仍然无法正常工作。

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

两个子项目都包含在一个父目录中,在其各自的子目录中带有一个父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)

编辑:
/ project
-/服务(取决于型号;这也是我要测试的内容)
--- / src
---- / main
----- / java
------ / Service.java
---- /测试
----- / java
------ / TestService.java

-/模型(独立)
--- / src
---- / main
----- / java
------ / Model.java

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

三个项目中的每一个都在内部拥有自己的pom.xml。

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

这里的父母:      parent / 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>

1 个答案:

答案 0 :(得分:0)

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是罐子,那么maven不会仅将这些信息用于编译/测试,而不会用于包装。

现在,maven在不同阶段具有不同的类路径:在分词器中,一个用于编译,一个用于单元测试。

因此,如果要指定仅测试需要依赖项,而不应将其视为“编译”依赖项,则定义范围:

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

如果您不指定任何范围,则maven会得出结论,无论是编译还是测试,甚至是打包,都需要依赖项,如我之前解释的那样。