web-dev-qa-db-ja.com

JUnitテストの実行中にクラスが見つからないという例外

EclipseでJUnitテストを実行すると、このエラーが発生します。

Class not found com.myproject.server.MyTest
Java.lang.ClassNotFoundException: com.myproject.server.MyTest
    at Java.net.URLClassLoader$1.run(URLClassLoader.Java:366)
    at Java.net.URLClassLoader$1.run(URLClassLoader.Java:355)
    at Java.security.AccessController.doPrivileged(Native Method)
    at Java.net.URLClassLoader.findClass(URLClassLoader.Java:354)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:423)
    at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:308)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:356)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClass(RemoteTestRunner.Java:693)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.loadClasses(RemoteTestRunner.Java:429)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:452)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.Java:683)
    at org.Eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.Java:390)

Mavenを使用しているにもかかわらず、クラスパスにJUnitライブラリを追加しようとしました。JUnitライブラリはPOM依存関係にあります。

私はすでにプロジェクトのクリーニングを試み、Eclipse用のJUnitプラグインを使用して新しいJUnitテストケースを作成しましたが、それでも同じエラーが発生します。

95
xybrek

これは、mvn clean compileを使用するとソースコードのみがコンパイルされるために発生するようです(maven 3.1.0を使用しているため、常にこのように動作するかどうかはわかりません)。

mvn testを実行すると、テストコードもコンパイルされますが、テストが実行されます(Eclipseでテストを実行しようとしている場合、すぐには望ましくない場合があります)。これを回避するには、Mavenコマンドにtest-compileを追加しますmvn cleanを実行するたびにシーケンスします。たとえば、mvn clean compile test-compileを実行します。

98
Newtrino

私のテストでも同様の問題が発生し、WebのどこかでプロジェクトのプロパティのBuild Pathに移動してMaven Dependencies above JREシステムライブラリ。それは私のために働いたようです。

91
slomek

私は同じ問題に直面し、@ slomekの answer を使用してそれを修正することができましたが、問題はその後再浮上しました。

最後に、プロジェクトの出力フォルダーをJUnitテストの実行構成に追加して修正しました。手順は次のとおりです。

  • Project properties -> Java Build Path -> Default output folder からプロジェクトの出力フォルダーを見つけます。
    • 通常、これは<project-folder>/binです
  • Run -> Run Configurations...に移動します
  • 単体テストの実行構成をクリックし、Classpathタブをクリックします
  • プロジェクトの出力フォルダーをUser Entriesの下に明示的に追加します-プロジェクトが既に含まれている場合でも
    • Advanced -> Add folderをクリックして、出力フォルダーを追加します

この問題は、Eclipseでの奇妙なプロジェクトのセットアップが原因である可能性があります。ネストされたMavenプロジェクトが単一のプロジェクト/フォルダーとしてインポートされたソースフォルダー(少なくともそれが私のプロジェクトのセットアップ方法でした)。

18
nhylated

この問題がEclipseでのみ発生する場合は、選択したプロジェクトでコマンドProject-> Clean ...を実行すると役立つ場合があります。

14
johanwannheden

ここですべてを改善せずに試した後、Eclipseを再起動するだけで問題を解決しました

11
Berit Larsen

私の場合、間違ったMavenディレクトリ構造がありました。

次のようになります:

/ src/test/Java / com.myproject.server.MyTest

それを修正した後、すべてが魅力のように機能しました。

3
ITisha

私の場合、次の手順だけがこの問題の解決に役立ちました。

  1. プロジェクト->プロパティ->実行/デバッグ設定。
  2. 「 '.....'の構成を起動」で、クラス/プロジェクトを選択します
  3. 編集->クラスパス->「デフォルトエントリの復元」
1
Roman Romaniuk

2つのリソースディレクトリを持つテストSourceSetを使用したGradleプロジェクトでも同じ問題が発生しました。

このスニペットはmain-module.gradleから取得され、リソースディレクトリをテストSourceSetに追加します。

sourceSets {
    test {
        resources {
            srcDir('../other-module/src/test/resources')
        }
    }
}

これを行うには、プロジェクトのメインモジュールのテストSourceSetに関連する2つのリソースディレクトリがありました。

../other-module/src/test/resources src/test/resources(main-moduleフォルダーに対して、Javaプラグインによって自動的に追加されます)

両方のソースディレクトリに同じ名前のファイルが2つあると、プロセスリソースの段階で問題が発生したことがわかります。その結果、コンパイルは開始されず、このため、JUnitがクラスを探していたbinディレクトリに.classはコピーされませんでした。 ClassNotFoundExceptionは、2つのファイルのいずれかの名前を変更しただけで消えました。

1
David Obber

NoClassDefFoundErrorは、クラスを初期化できないことを意味します。クラスを見つけることに関係するnothingがあります。 null文字列でtrim()を呼び出すと、このエラーが発生しました。

JUnitはNullPointerExceptionを表示しません。テストに使用できないプロパティファイルから文字列を取得しているため、通常実行中の文字列はnullではありません。

テストが合格し始めるまで、クラスからピースを削除することをお勧めします。その後、エラーが発生している行を特定できます。

1
Philip Rego

以前、この場合、私は常にmvn Eclipse:eclipseを実行し、Eclipseを再起動しました。 GITに移行した後、私にとっては機能しなくなりました。

ここでの基本的な問題は、Mc Eclipseがコンパイルされたクラスを見つけられないことです。次に、出力フォルダーをProject/target/test-classesとして設定します。これは、テストをスキップせずにデフォルトでmvn clean installによって生成され、次の回避策を進めました。

オプション1:各テストケースのクラスパスを設定する

Eclipse->実行->実行構成-> JUnitの下-> mytestの選択->クラスパスタブの下->ユーザーエントリの選択->詳細設定->フォルダの追加->選択->適用->実行

オプション2:クラスパス変数を作成し、すべてのテストケースのクラスパスに含める

Eclipse-> Windows-> Classpath Variables-> New-> [Name:Junit_test_cases_cp | path:]-> ok次にEclipse-> Run-> Run Configurations-> JUnit-> select mytest-> classpath tab-> Select User Entries-> Advanced-> Add classpath variables-> Select Junit_test_cases_cp-> ok- >適用->実行

これは、オンラインですべての提案を試した後、現在私のために働いている唯一のものです。

1
user3222211

私は同じ問題に直面していました。インターネットから外部からダウンロードして追加した外部JUnit jar依存関係を削除することで解決しました。しかし、その後、プロジェクト->プロパティ->ビルドパス->ライブラリの追加-> junit->バージョン(ex junit4)-> applyを選択しました。

依存関係が自動的に追加されました。それは私の問題を解決しました。

0
Agniva Dutta

EGitを使用していて、たとえばCloverのようなテストカバレッジツールのためにクラスパスが更新された場合、/path/to/git/repository/<project name>/bin/の内容を完全には削除しないクリーンアップの問題があることを別の回答として言及する価値があります

基本的に、Eclipseのエラーログビューを使用して、このクリーンアップ作業中に問題の原因を特定し、ソースディレクトリに移動し、<project name>/binディレクトリを手動で削除しました。それが終わったら、Eclipseに戻ってプロジェクトを更新(F5)し、エラーはなくなりました。

0
Blake Neal

ダミーの変更を行い、テストクラスを保存すると、問題を解決できます。 .classを自動的に構築します

0
Lorenzo Lerate

1- mvn Eclipse:Eclipse

2-すべてのプロジェクトをクリーンアップするプロジェクト

3-再起動

0
Toumi

JunitsをデバッグするEclipse Heliosでも同様の問題がありました。 Junitsを正常に実行できたのと同じJUNITのデバッグ中にClassNotFoundExceptionが発生したため、私の問題は少し異なりました。

Stackoverflow.comや他のフォーラムで利用可能なあらゆる種類のソリューションを試しましたが、何も機能していないようです。これらの問題で2日近く頭を動かした後、最終的にその解決策を見つけました。

いずれのソリューションも機能しない場合は、ワークスペースで作成された.metadataフォルダーを削除するだけです。これにより、プロジェクトとすべての種類の構成をインポートするオーバーヘッドが追加されますが、これらは確実にこれらの問題を解決します。

これらが役立つことを願っています。

0
Nayan

これらの手順はうまくいきました。

  • ローカルMavenリポジトリのコンテンツを削除します。
  • コマンドラインでmvn clean installを実行します。 (pomディレクトリに移動します)。
  • Eclipseでプロジェクトをビルドします。
0

コンパイルの問題のようです。プロジェクトをMavenテストとして実行してから、JUnitテストとして実行します。

0
Yao Li

プロジェクトが通常のJavaプロジェクトではなく、Mavenプロジェクトとして開かれているかどうかを確認します。実際には簡単ですが、それはあなたがそれを見逃すかもしれないのとまったく同じ理由です。

0
Ben

「[ERROR]この環境ではコンパイラが提供されていません。おそらく、JDKではなくJREで実行していますか?」が原因である可能性もあります。

0
William