何らかの理由で、JUnit 4テストクラスを実行するMaven 2 Surefireプラグインを取得できません。
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");
}
}
その後、実行されます。私がやったことは次のとおりです。
~/.m2/repository/org/Apache/maven/surefire
-それらはすべてバージョン2.4.2または2.4.3のいずれかです。mvn dependency:tree | grep junit
junitバージョン4.7のみに依存するようにする私がこの問題を抱えているモジュールには、JUnit 3テストがありません。
不足しているものはありますか?
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
そのため、問題はJUnit v3.8.1を必要とするtestng
jarから発生したようです。 Test Classpath
はJUnit 4に依存するように設定されていましたが、手遅れでした。
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
は友達です。あなたの助けをありがとう。残念ながら、PascalとKalebの間で回答ポイントを分割する方法はありませんが、mvn -X
を使用するというKalebのアドバイスは、正しい回答ポイントが彼に届くように私を助けました。
Surefireプラグインは、クラスパスに基づいてどのJUnitプロバイダーを使用する必要があるかを判断します。クラスパスに複数のJUnitバージョンがある場合、クラスパスを修正して(上記で説明したように)クラスパスにJUnitバージョンを1つだけ持つか、使用するプロバイダーを明示的に指定できます。たとえば、最新のプロバイダー(たとえば、「surefire-junit47」)を使用して(親)POM強制で以下を指定します。
[...]
<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>
[...]
「実行できない」とはどういう意味かわかりませんが、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を実行すると、有用な情報が提供されますか?
考えられるもう1つの原因は、このバグ(「修正しない」で終了)です: https://issues.Apache.org/jira/browse/SUREFIRE-587
短い要約:TestCaseを拡張する(ただし、アノテーションを使用しない)テストは、名前が「Test」で終わらない場合は選択されません。
なぜMavenがJUnitテストを受け取らないのかと疑問に思っている世の中の貧しい人々のために。
私はJUnitとTestNGの両方を依存関係として持っています。しかし、私はフェイルセーフでTestNGを使用して機能テストを実行し、surefireでJUnitを使用してユニットテストを実行したいと考えています。
ただし、surefireがTestNGを使用して単体テストを実行しようとしていることがわかり、実行するものが見つかりませんでした。私のJUnitテストはスキップされました。
後で私はこれに遭遇しました Maven issue そして次のような「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>
これが誰かを助けることを願っています。
Google社員のために、この問題が発生したのは、TestNGを取り込むPowerMock依存関係が含まれていたため、SureFireによって[TestNG]テストが検出されなかったためです。
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が他の場所から入ってくる場合は直接TestNGを除外できます。)
行った検証は良好です。特に、バージョン2.3+のsurefireプラグインを使用していることを確認してください(デフォルトでは、バージョン2.4.3がmaven 2.1 super POM これで問題ありません)、junit-3.8.1.jar
依存関係を推移的にプルしないことを確認します。
さて、これが「グローバルな問題」ではないことを確認するために(TBHとは思わない)、たとえば次のコマンドを実行して、プロジェクトを最初から作成できますか?
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構成(問題のあるプロジェクトから)で質問を更新してください。
1.)次のsurefireプラグインをpom.xmlに含めます
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20</version>
<configuration>
</configuration>
</plugin>
2.)デフォルトでは、surefireプラグインはパッケージからテストクラスを選択します:-src/test/Java/....
ビルドパスに移動し、以下のようにクラスパスにテストフォルダーを含めます。
3.)-> Run As-> Maven Testに移動します
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.081
s - in com.bnym.dcm.api.controller.AccountControllerTest
[INFO] Running com.bnym.dcm.api.controller.DCMApiControllerTest
[INFO] Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 s -
in com.bnym.dcm.api.controller.DCMApiControllerTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ----------------------------------------------------------------------
--
[INFO] BUILD SUCCESS
ちょっとした変更で面白くなりました!!!
クラス名をMyClassTestからTestMyClassに変更しました。親POM.xmlに次の行が含まれています
<test.include.pattern> **/Test*.Java <test.include.pattern/>
次のように、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は注釈に問題が発生します
統合テストを実行しようとしたときに同様の問題がありました。 jUnitではなくTestNGを実行しようとした古いバージョンのsurefireプラグインがありました。 POMのバージョン番号を2.20に変更しました。