4

我的应用程序中的一些单元测试与查找和操作属于应用程序本身的某些文件资源有关。我需要在应用程序的实际生产环境中执行这些测试,将其部署为 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>

提前感谢您的帮助!

4

1 回答 1

4

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

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

有许多教程用于设置 Maven 以运行集成测试。 这里这里有几个首发。故障安全插件通常用于执行集成测试。

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

于 2012-08-30T20:47:56.910 回答