web-dev-qa-db-ja.com

Eclipse / Maven:JUnitテストの実行時にコンパイルされない

私はMavenとEclipse(m2Eclipseプラグイン)を使用してプロジェクトに取り組んでいます。 JUnitテストに問題があります。

時々、Eclipse内でそれらを実行すると、コンパイルされないことがありますが、代わりに古いクラスファイルが使用されます。クラスファイルを削除すると、EclipseでClassNotFoundExceptionsが取得されます。その後、mvn test-compileまたはその他の目標を使用して、手動で再コンパイルする必要があります。

また、テストのクラスファイルがtest-classesの代わりにclassesサブディレクトリに置かれることもあります。

私は本当に何が間違っているのかわかりません。

JUnit Javaファイルはsrc/main/Java内にあり、正しく名前が付けられています(*Test.Java)。

常にMaven経由でコンパイルして実行する必要がありますか?実行したいときにEclipseがファイルをコンパイルしないのはなぜですか? (興味深いことに、時々あります。すべてが完全に機能することもあります。)

68
Tom

STS Eclipse(Spring開発版)、m2e、JUnitでも同じ問題がありました。解決策は、src/test/Javaの出力フォルダーをtarget/test-classesに設定することでした。

  1. パッケージエクスプローラーでsrc/test/Javaフォルダーを右クリックします
  2. Build Path-> Configure Output Folderを選択します
  3. target/test-classesと入力して、[〜#〜] ok [〜#〜]をクリックします

これで、テストクラスの変更が正しくコンパイルされ、EclipseでJUnitテストを実行できるようになります。

問題は、Eclipseが単体テストをデフォルトの出力フォルダーtarget/classesにコンパイルする一方で、JUnitプラグインがtest-classesから単体テストを正しく実行しようとすることです。

この質問にはいくつかの重複があります。

86
apa64

以下の回答に加えて

  1. Src/test/Javaフォルダーを右クリックします
  2. [ビルドパス]-> [出力フォルダーの構成]を選択します。
  3. ターゲット/テストクラスを入力し、[OK]をクリックします

プロジェクトを右クリックしてProperties-> Builderに進み、Builderが正しくセットアップされていることを確認する必要があります。ビルダーが見つからない場合は、ビルダーをインストールする必要があります。私の場合、mavenプロジェクトにはAspectJ依存関係があり、Maven Eclipseプラグインを使用してEclipseプロジェクトをビルドすると、デフォルトでAspectJビルダーを探していました。 AspectJ開発ツールをインストールし、問題を解決しました。

お役に立てれば!

5
Roosh

もう1つのポイント:JUnitテストクラスはsrc/main/Javaではなくsrc/test/Javaにある必要があります。そうでない場合、テストクラスとしてMavenによって正しく検出されず、テストjarではなくパッケージjarに含まれます。 。

2
dunni

直面している問題の最も可能性の高い説明は、src/test/Javaが正しく構成されていません。

この設定を手動で修正する の代わりに、m2Eclipseにこれを修正させることができます:プロジェクトを右クリックしてMaven> Update Project

2
oberlies

同じ問題に直面しました。出力フォルダーとMaven> Update Projectの構成に関する上記の提案を試みましたが、どちらも機能しませんでした。最終的にtestOutputDirectoryも「build/classes」に変更され、ユニットテストが取得されて実行されるようになりました。

最後に問題の理由を見つけました。私のPOMでは、以下のようにMavenコンパイラプラグインも設定しました

        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
                <outputDirectory>build/classes</outputDirectory>
            </configuration>
       </plugin>

outputDirectory構成は不要であり、上記の問題の原因でした。このタグを削除すると、junitはbuild> testclassesフォルダーにコンパイルされ、mavenビルド中にも実行されます。 Yippee :)

1
Pushkin

プロジェクトアイコンに感嘆符があることを確認してください!私の場合、次のような感嘆符があることを無視しました。 プロジェクトアイコンの感嘆符

「マーカー」パースペクティブを開き、ヒントに従って問題をトラブルシューティングします。 「マーカー」パースペクティブが示すもの

Junitテストクラスは、「マーカー」パースペクティブで警告される読み取り不能なjarを参照していないため、「mvn clean test」を呼び出した後に正常に実行できます。したがって、それを無視するのは簡単です。

1
ElliotMok

Java-scala mixプロジェクトで作業している人にとって、これは注意すべきことです。以下に示す方法で構成を行った後でも、

<build>
    <testOutputDirectory>${basedir}/target/test-classes</testOutputDirectory>
    <plugins>
    ...
        <plugin>
            <groupId>net.alchim31.maven</groupId>
            <artifactId>scala-maven-plugin</artifactId>
            <version>3.3.2</version>
            <configuration>
                <testSourceDir>${basedir}/src/test/scala</testSourceDir>
                <testOutputDir>${basedir}/target/test-classes</testOutputDir>
            </configuration>
         </plugin>
    </plugins>
</build>

Maven> Update Projectを実行すると、Eclipseはプロジェクト内のsrc/test/Javaフォルダーの出力ディレクトリを優先しますが、src/test/scalaフォルダー。 (特定のソースフォルダーを右クリックし、を選択することでこれを把握できます)(ビルドパス>出力フォルダーの構成...前者の場合はpomで指定されますが、後者の場合は指定されません。

これは、scalaとm2eを使用した場合の既知のバグです。ここで説明したとおりです。 http://scala-ide.org/docs/tutorials/m2Eclipse/

警告

2013年3月の時点で、バグによりsrc/main/scalaとsrc/test/scalaの両方がデフォルトの出力フォルダー(target/classes)を使用します。クラスファイルはコマンドラインでビルドするときのようにターゲット/テストクラスで終わらないので、これはテストをビルドするときに混乱を招くかもしれません。この問題を回避するには、src/test/scalaの出力フォルダーを手動で変更します。

1
Gulats

Pom.xmlで設定できる「testSourceDirectory」パスを確認してください。次に、フォルダー(「testSourceDirectory」パスで構成されている)をEclipseビルドパスに追加します。

以下のpom.xmlでサンプル「testSourceDirectory」を見つけてください。

<build>
    <testSourceDirectory>src/test/Java</testSourceDirectory>
    <plugins>
     <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>      
    </plugins>
  </build>
1
developer

Eclipseは、クラスファイルをいじることを期待していません。 Eclipseでファイルを編集していない場合、ファイルは変更されておらず、コンパイルする必要がないと想定しています。この問題は、EclipseとMavenが出力ディレクトリを共有していることに起因すると思います。私のmvnビルドが失敗した場合、これをよく目にします。クリーンではあるがコンパイルされていない新しいファイルの一部としてクラスファイルを削除します。最善の解決策は、mvnとEclipseの別々のビルドディレクトリを持つことだと思いますが、私はこれを調べたことはありません。

0
James Scriven

私の問題はJUnitプラグインではなく、pom.xmlの設定でした。

この質問に対するすべての答えを確認した後、@ Gulatsの答えは、maven-compiler-pluginセクションにtestOutputDirectoryを設定する必要があることを暗示しており、それがトリックを行いました。

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.8</source>
    <target>1.8</target>
    <testOutputDir>${basedir}/target/test-classes</testOutputDir>
  </configuration>
</plugin>
0
Jim Kiley