1. 概要

この記事では、NoSuchMethodErrorおよびNoClassDefFoundErrorJUnitエラーを修正する方法を学習します。 このような問題は通常、クラスパスに2つの異なるJUnitバージョンがある場合に発生します。 この状況は、たとえば、プロジェクトのJUnitバージョンがMavenまたはGradleの依存関係で使用されているものと異なる場合に発生する可能性があります。

2. SpringプロジェクトでのJUnitのNoClassDefFoundError

Spring Boot2.1.2とSpring Bootスターターテストの依存関係を使用するMavenプロジェクトがあるとします。 このような依存関係があるため、spring-boot-test依存関係のJUnitバージョンであるJUnit5.3.2を使用して自動テストを記述して実行できます。

ここで、Spring Boot2.1.2を引き続き使用するとします。 ただし、JUnit5.7.1を使用します。 考えられるアプローチは、 junit-jupiter-api junit-jupiter-params junit-jupiter-engine 、およびjunitを含めることです。 – pom.xmlファイルのplatform-launcher依存関係:

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-api</artifactId>
    <version>5.7.1</version>
    <scope>test</scope>
</dependency>
...

それでも、この場合、テストを実行するとNoClassDefFoundErrorが発生します。

[ERROR] java.lang.NoClassDefFoundError: org/junit/platform/commons/util/ClassNamePatternFilterUtils

JUnit 5.4.0に移行すると、 NoClassDefFoundError の代わりに、NoSuchMethodErrorが発生します。

3. エラーの理解と修正

前のセクションで説明したように、JUnitバージョンを5.3.2から5.7.1に移行しようとすると、NoClassDefFoundErrorが発生しました。

このエラーは、クラスパスに2つの異なるバージョンのJUnitが含まれることになったために発生しました。 したがって、私たちのプロジェクトは新しいバージョンのJUnit(5.7.1)でコンパイルされましたが、実行時に古いバージョン(5.3.2)が見つかりました。 その結果、JUnitランチャーは、古いバージョンのJUnitでは使用できないクラスを使用しようとしました。

次に、このエラーを修正するためのさまざまな解決策を学習します。

3.1. SpringのJUnitバージョンをオーバーライドする

この例のエラーを修正するための効果的なアプローチは、Springによって管理されているJUnitバージョンをオーバーライドすることです。

<properties>
    <junit-jupiter.version>5.7.1</junit-jupiter.version>
</properties>

これで、JUnitの依存関係を次の依存関係に置き換えることもできます。

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
</dependency>

この単一の依存関係には、 junit-jupiter-api junit-jupiter-params 、およびjunit-jupiter-engineが含まれます。 junit-platform-launcher 依存関係は通常、JUnitテストをプログラムで実行する必要がある場合にのみ必要です

同様に、Gradleプロジェクトの管理対象バージョンをオーバーライドすることもできます

ext['junit-jupiter.version'] = '5.7.1'

3.2. あらゆるプロジェクトのソリューション

前のセクションでは、SpringプロジェクトでNoSuchMethodErrorおよびNoClassDefFoundError JUnitエラーを修正する方法を学びました。これは、最も一般的なシナリオです。 ただし、これらのエラーが発生していて、プロジェクトでSpringを使用していない場合は、Mavenの依存関係の衝突を修正してみてください。

Springの例で起こったことと同様に、プロジェクトには、推移的な依存関係のために複数のバージョンのJUnitが含まれている可能性があります。 このようなシナリオでは、Mavenで衝突を解決する方法に関する詳細なチュートリアルがあります。

4. 結論

このチュートリアルでは、NoSuchMethodErrorおよびNoClassDefFoundErrorJUnitエラーを再現して修正する方法を学びました。 コードスニペットは、いつものように、GitHubにあります。 このソースコードの例では、親プロジェクトpom.xmlファイルのJUnitバージョンをオーバーライドしていることに注意してください。