40

何らかの理由で、Maven 2 Surefire プラグインで JUnit 4 テスト クラスを実行できません。

public class SimpleTest {
  @org.junit.Test
  public void simple() {
     System.out.println("foo");
  }
}

ただし、このクラスを JUnit-3 のようなものに変更すると、

public class SimpleTest extends junit.framework.TestCase {
  public void testBar() {
     System.out.println("bar");
  }

  @org.junit.Test
  public void simple() {
     System.out.println("foo");
  }
}

その後、実行されます。これが私がやったことです:

  • 検証済み Maven バージョン: Apache Maven 2.2.1 (r801777; 2009-08-06 20:16:01+0100)
  • 確認済みの Surefire バージョン:このアドバイスに従いました
  • 検証済みの Surefire バージョン: 私の中でチェックされた Surefire jars ~/.m2/repository/org/apache/maven/surefire-- それらはすべてバージョン 2.4.2 または 2.4.3 のいずれかです
  • mvn dependency:tree | grep junit私がjunitバージョン4.7にのみ依存していることを確認するために行った

この問題が発生しているモジュールには、JUnit 3 テストがありません。

私が見逃しているものは他にありますか?

4

13 に答える 13

38

mvn -X次のことを明らかにするのに役立ちました:

...
[INFO] [surefire:test {execution: default-test}]
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.apache.maven.surefire:surefire-booter:jar:2.4.3:runtime (selected for runtime)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.4.3:runtime (selected for runtime)
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/apache/maven/surefire/surefire-booter/2.4.3/surefire-booter-2.4.3.jar
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/apache/maven/surefire/surefire-api/2.4.3/surefire-api-2.4.3.jar
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG]   org.testng:testng:jar:jdk15:5.8:test (selected for test)
[DEBUG]     junit:junit:jar:3.8.1:test (selected for test)
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/org/testng/testng/5.8/testng-5.8-jdk15.jar
[DEBUG] Adding to surefire booter test classpath: /home/mindas/.m2/repository/junit/junit/3.8.1/junit-3.8.1.jar
[DEBUG] dummy:dummy:jar:1.0 (selected for null)
[DEBUG] Retrieving parent-POM: org.apache.maven.surefire:surefire-providers:pom:2.4.3 for project: null:surefire-testng:jar:null from the repository.
[DEBUG] Adding managed dependencies for unknown:surefire-testng
[DEBUG]   org.apache.maven.surefire:surefire-api:jar:2.4.3
[DEBUG]   org.apache.maven.surefire:surefire-booter:jar:2.4.3
[DEBUG]   org.codehaus.plexus:plexus-utils:jar:1.5.1
[DEBUG]   org.apache.maven.surefire:surefire-testng:jar:2.4.3:test (selected for test)
[DEBUG]     org.apache.maven:maven-artifact:jar:2.0:test (selected for test)
[DEBUG]       org.codehaus.plexus:plexus-utils:jar:1.0.4:test (selected for test)
[DEBUG]     junit:junit:jar:3.8.1:test (selected for test)
[DEBUG]     org.testng:testng:jar:jdk15:5.7:test (selected for test)
[DEBUG]     org.apache.maven.surefire:surefire-api:jar:2.4.3:test (selected for test)
...
[DEBUG] Test Classpath :
...
[DEBUG]   /home/mindas/.m2/repository/junit/junit/4.7/junit-4.7.jar

testngしたがって、 JUnit v3.8.1 を必要とする jarから問題が発生したようです。JUnit 4 に依存するように設定されていたにもかかわらずTest Classpath、手遅れでした。

testng依存関係は私のPOMにありました:

<dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>5.8</version>
  <scope>test</scope>
  <classifier>jdk15</classifier>
</dependency>

コメントアウトした直後に、テストの実行が開始されました。

学んだ教訓:

  • mvn dependency:tree常に十分でmvn -Xはありません、友達です。
  • Surefire は開発者天国向けに作られたものではありません (プロジェクト JIRA のレポートを見て、これに気づきました)。Maven を使用する場合、他に選択肢がないため、これは特に当てはまります。

助けてくれてありがとう。残念ながら、パスカルとカレブの間で回答ポイントを分割する方法はありませんが、使用するカレブのアドバイスは、mvn -X私が正しい道を歩むのに役立ち、正しい回答ポイントは彼に与えられました.

于 2010-01-08T12:33:59.103 に答える
28

Surefire プラグインは、クラスパスに基づいて、どの JUnit プロバイダーを使用する必要があるかを判断します。クラスパスに複数の JUnit バージョンがある場合は、(前述のように) クラスパスに JUnit バージョンが 1 つだけ含まれるようにクラスパスを修正するか、使用するプロバイダーを明示的に指定することができます。たとえば、(親) POM で次のように指定すると、最新のプロバイダー (たとえば、「surefire-junit47」) が使用されます。

[...]
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.8</version>
  <dependencies>
    <!-- Force using the latest JUnit 47 provider -->
    <dependency>
      <groupId>org.apache.maven.surefire</groupId>
      <artifactId>surefire-junit47</artifactId>
      <version>2.8</version>
    </dependency>
  </dependencies>
[...]

ただし、Surefire 2.7 では、実行する単体テスト クラスを決定する方法が変更されていることに注意してください。JUnit 4 で Surefire 2.7 (またはそれ以降) を使用する場合の新しい動作は、@Test アノテーションのないテストは自動的にスキップされることです。これは、JUnit 4 の単体テストだけを使用する場合には便利ですが、JUnit 3 と 4 の単体テストを組み合わせて使用​​する場合、「surefire-junit47」プロバイダーを使用すると正しく機能しません。そのような場合、「surefire-junit4」プロバイダーを明示的に選択するのが最善です:

[...]
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.8</version>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven.surefire</groupId>
      <!-- Use the older JUnit 4 provider -->
      <artifactId>surefire-junit4</artifactId>
      <version>2.8</version>
    </dependency>
  </dependencies>
[...]
于 2011-04-05T21:24:48.493 に答える
13

「実行できない」とはどういう意味かわかりませんが、?で使用するインクルードを明示的に設定するのに役立ちmaven-surefire-pluginますか?

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.4.3</version>
    <configuration>
        <includes>
            <include>**/*Test.java</include>
        </includes>
    </configuration>
</plugin>

-Xまた、フラグを付けてMavenを実行すると、有用な情報が得られますか?

于 2010-01-07T17:56:10.623 に答える
13

もう 1 つの考えられる原因は、次のバグです (「修正されません」で閉じられています): https://issues.apache.org/jira/browse/SUREFIRE-587

簡単な要約: TestCase を拡張する (しかし注釈を使用しない) テストは、名前が "Test" で終わらない場合は選択されません。

于 2013-07-04T12:15:25.143 に答える
7

なぜ Maven が JUnit テストを取得しないのか疑問に思っている貧しい人々のために。

依存関係として JUnit と TestNG の両方があります。しかし、TestNG を使用して機能テストを実行するフェイルセーフと、JUnit を使用して単体テストを実行する確実な機能が必要です。

しかし、surefire が TestNG を使用して単体テストを実行しようとしていて、何も実行できないことがわかりました。JUnit テストがスキップされました。

後で、このMavenの問題に遭遇し、次のような「JUnit」テストのみを実行するようにsurefireを構成しました。

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
  <configuration>
    <properties>
      <property>
        <name>junit</name>
        <value>true</value>
      </property>
    </properties>
  </configuration>
</plugin>

これが誰かに役立つことを願っています。

于 2016-09-05T03:04:48.690 に答える
5

Google 社員のために、この問題が発生したのは、TestNG をプルする PowerMock 依存関係を含めたため、[TestNG] テストが SureFire によって検出されなかったことが原因でした。

POM エディターの m2eclipse の [依存関係階層] タブを使用して依存関係を見つけ、右クリックして除外を生成しました (以下の XML を参照)。

完全を期すために (および m2eclipse を使用していない場合)、依存関係を除外する XML を次に示します。Maven のこの機能に出会ったのは、これらのタグが自動的に生成されるのを確認したときだけです。

<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-mockito-release-full</artifactId>
  <version>1.4.9</version>
  <classifier>full</classifier>
  <exclusions>
    <exclusion>
      <artifactId>powermock-module-testng</artifactId>
      <groupId>org.powermock</groupId>
    </exclusion>
  </exclusions>
</dependency>

(私の場合、「powermock-module-testng」を除外するだけで十分でしたが、TestNG が別の場所から入ってくる場合は直接除外できます。)

于 2011-08-03T10:32:32.787 に答える
4

依存関係にJUnit 5 ( import org.junit.jupiter.api.Test;) があり、いくつかの JUnit4 ( ) テストを実行しようとしてimport org.junit.Test;いる場合は、次の依存関係を必ず含めてください。

<dependency>
  <groupId>org.junit.vintage</groupId>
  <artifactId>junit-vintage-engine</artifactId>
  <scope>test</scope>
</dependency>
于 2021-04-18T11:55:56.050 に答える
1

あなたが行った検証は良好です。特に、surefire プラグインのバージョン 2.3+ を使用していることを確認し (デフォルトでは、maven 2.1スーパー POMでバージョン 2.4.3 を取得するため、これで問題ありません)、junit-3.8.1.jar依存関係を推移的に引っ張らない。

さて、これが「グローバルな問題」ではないことを確認するために (私はそうは思いません)、たとえば次のコマンドを実行して、ゼロからプロジェクトを作成していただけますか。

mvn archetype:create -DgroupId=com.mycompany.app -DartifactId=maven-junit4-testcase

次に、junit の依存関係を更新します。

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.7</version>
  <scope>test</scope>
</dependency>

そして、コンパイラレベルを 1.5+ に設定します

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.5</source>
    <target>1.5</target>
  </configuration>
</plugin>

最後に、SimpleTest.java次を入れてAppTest.java実行しますmvn test

そのプロジェクトで実行が正常mvn testに機能する場合 (問題なく実行されることを期待しています)、使用している POM 構成で質問を更新してください (問題のあるプロジェクトから)。

于 2010-01-07T17:12:44.527 に答える
0

次のように、正しいコンパイラ レベル用に maven-compile-plugin を構成しましたか。

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <source>1.5</source>
    <target>1.5</target>
  </configuration>
</plugin>

そうしないと、maven はアノテーションで問題が発生します

于 2010-01-07T16:39:48.217 に答える
0

Maven を使用している場合は、ファイル名が重要です。

デフォルトでは、テスト ファイル名は "Test" または "Tests" で開始または終了する必要があります。そうしないと、テストを検索するときに無視されます。

https://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html

于 2020-07-28T02:02:54.837 に答える