在将类路径设置为生成的项目JAR的情况下执行Maven单元测试



我的应用程序中的一些单元测试与查找和操作作为应用程序本身一部分的某些文件资源有关。我需要在应用程序的实际生产环境中执行这些测试,在那里它被部署为JAR文件,而不是分解的目录。

我如何指示Maven执行我的单元测试,将项目生成的jar文件(以及任何其他声明的库依赖项)作为类路径,而不是像默认情况下那样在文件系统中编译类?。

换句话说,现在我的单元测试的类路径设置为:/$PROJECTPATH/target/classes/

相反,我希望将这个类路径设置为:/$PROJECTPATH/target/myjarfile.jar

我尝试手动添加和删除依赖类,如下所述:http://maven.apache.org/plugins/maven-surefire-plugin/examples/configuring-classpath.html,但直到现在它都不起作用。

我目前的项目POM是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.mygroupid</groupId>
  <artifactId>myartifact</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
      ...
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.1</version>
        <configuration>
        <source>1.7</source>
        <target>1.7</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <version>2.1.2</version> 
        <executions>
          <execution>
            <id>attach-sources</id>
            <goals>
              <goal>jar</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-dependency-plugin</artifactId>
        <version>2.4</version>
        <configuration>
              <includeScope>runtime</includeScope>
              <outputDirectory>${project.build.directory}/lib</outputDirectory>
        </configuration>
        <executions>
          <execution> 
            <id>copy-dependencies</id>
            <phase>process-resources</phase>
            <!-- <phase>package</phase>  -->
            <goals>
              <goal>copy-dependencies</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.3</version>
        <configuration>
              <classpathDependencyExcludes>
                <classpathDependencyExclude>
                  ${project.build.outputDirectory}
                </classpathDependencyExclude>
              </classpathDependencyExcludes>
              <additionalClasspathElements>
                <additionalClasspathElement>
              ${project.build.directory}/${project.build.finalName}.${project.packaging}
                </additionalClasspathElement>
              </additionalClasspathElements>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

提前感谢您的帮助!。

作为测试生命周期阶段的一部分执行的标准单元测试看不到项目JAR,因为test阶段在package阶段之前执行,所以测试在Maven生成JAR之前运行。有关生命周期阶段及其顺序的列表,请参阅本页。

您希望它将测试作为集成测试来运行,集成测试在integration-test阶段执行。

有许多关于设置Maven以运行集成测试的教程。这里有几个先发球员。故障保护插件通常用于执行集成测试。

我记不清集成测试是使用target/classes还是类路径中项目的JAR文件。但如果没有,你可以总是创建另一个Maven项目,在那里添加你的测试,并将主项目作为这个集成测试项目的依赖项添加。在某些情况下,如果主项目不仅仅是一个标准的Java库,例如,如果您正在编写注释处理器,那么这可能比在主项目中使用集成测试阶段更可取。

最新更新