4

アプリケーションの一部の単体テストは、アプリケーション自体の一部である特定のファイル リソースの検索と操作に関連しています。これらのテストは、展開されたディレクトリとしてではなく、JAR ファイルとして展開されるアプリケーションの実際の運用設定で実行する必要があります。

デフォルトでファイルシステムにコンパイルされたクラスではなく、プロジェクトが生成したjarファイル(およびその他の宣言されたライブラリ依存関係)をクラスパスとして考慮して単体テストを実行するようにMavenに指示するにはどうすればよいですか?

つまり、現在、単体テストのクラスパスは次のように設定されています/$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

テスト ライフサイクル フェーズの一部として実行される標準単体テストは、testフェーズがフェーズの前に実行されるため、プロジェクト JAR を参照できませんpackage。そのため、Maven が JAR を生成する前にテストが実行されます。ライフサイクル フェーズとその順序のリストについては、このページを参照してください。

integration-testフェーズで実行される統合テストとしてテストを実行するもの。

統合テストを実行するように Maven を設定するためのチュートリアルが多数あります。 ここここにいくつかのスターターがあります。フェイルセーフ プラグインは通常、統合テストの実行に使用されます。

統合テストtarget/classesがクラスパスでプロジェクトの JAR ファイルを使用するかどうかを正確に思い出すことはできません。ただし、常に別の Maven プロジェクトを作成できない場合は、そこにテストを追加し、メイン プロジェクトをこの統合テスト プロジェクトへの依存関係として追加します。注釈プロセッサを作成している場合など、メイン プロジェクトが単なる標準の Java ライブラリではない場合、場合によっては、メイン プロジェクトで統合テスト フェーズを使用するよりも、これが望ましい場合があります。

于 2012-08-30T20:47:56.910 に答える