わかりました、イライラしました!私はかなりの時間を探し回りましたが、それでも困惑しています。
環境:WinXP、Eclipse Galileo 3.5(直接インストール-追加のプラグインなし)。
だから、私は簡単なJUnitテストを持っています。内部のEclipse JUnit実行構成から問題なく実行されます。このクラスは何にも依存していません。この問題を可能な限り絞り込むために、次の内容が含まれています。
@Test
public void testX() {
assertEquals("1", new Integer(1).toString());
}
これまでのところ汗はありません。ここで、Ant内からこのテストケースを実行するという非常に高度な手順を実行します(最終的な目標はHudsonとの統合です)。
それで、私はbuild.xmlを作成します:
<project name="Test" default="basic">
<property name="default.target.dir" value="${basedir}/target" />
<property name="test.report.dir" value="${default.target.dir}/test-reports" />
<target name="basic">
<mkdir dir="${test.report.dir}" />
<junit fork="true" printSummary="true" showOutput="true">
<formatter type="plain" />
<classpath>
<pathelement path="${basedir}/bin "/>
</classpath>
<batchtest fork="true" todir="${test.report.dir}" >
<fileset dir="${basedir}/bin">
<include name="**/*Test.*" />
</fileset>
</batchtest>
</junit>
</target>
</project>
$ {basedir}は、ソース、クラス、ビルドファイルを含むワークスペース内のJavaプロジェクト名です。すべての.Javaとbuild.xmlは$ {basedir}/srcにあります。クラスファイルは$ {basedir}/binにあります。
私はEclipse-install-dir/plugins/org.junit4_4.5.0.v20090423/junit.jarをWindows/Preferences/Ant/Runtime/Contributed Entriesを介してAntランタイムクラスパスに追加しました。 ant-junit.jarはAntホームエントリにあります。
では、このめちゃくちゃ複雑なターゲットを実行するとどうなりますか?レポートファイルに含まれるもの:
Testsuite: com.xyz.test.RussianTest
Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec
Testcase: initializationError took 0 sec
Caused an ERROR
org/hamcrest/SelfDescribing
Java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
at Java.lang.ClassLoader.defineClass1(Native Method)
at Java.lang.ClassLoader.defineClass(Unknown Source)
at Java.security.SecureClassLoader.defineClass(Unknown Source)
at Java.net.URLClassLoader.defineClass(Unknown Source)
at Java.net.URLClassLoader.access$000(Unknown Source)
at Java.net.URLClassLoader$1.run(Unknown Source)
at Java.security.AccessController.doPrivileged(Native Method)
at Java.net.URLClassLoader.findClass(Unknown Source)
at Java.lang.ClassLoader.loadClass(Unknown Source)
at Sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at Java.lang.ClassLoader.loadClass(Unknown Source)
at Java.lang.ClassLoader.loadClassInternal(Unknown Source)
at Java.lang.reflect.Constructor.newInstance(Unknown Source)
Caused by: Java.lang.ClassNotFoundException: org.hamcrest.SelfDescribing
at Java.net.URLClassLoader$1.run(Unknown Source)
at Java.security.AccessController.doPrivileged(Native Method)
at Java.net.URLClassLoader.findClass(Unknown Source)
at Java.lang.ClassLoader.loadClass(Unknown Source)
at Sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at Java.lang.ClassLoader.loadClass(Unknown Source)
at Java.lang.ClassLoader.loadClassInternal(Unknown Source)
このorg.hamcrest.SelfDescribingクラスとは何ですか?モックとは何か?いいよ。しかし、なぜ依存関係なのか?私はそれで何もしていません。これは文字通りJavaプロジェクトであり、JUnit以外の依存関係はありません。
困惑(そしてイライラ)!
JUnit 4.7をダウンロードし、junit-4.7.jarを(古いバージョンではなく)ビルドパスに配置しました。それで解決しました。アリには触れなかった。
テスト用クラスパスにhamcrest.jarも追加します
同じ問題の理由を見つけましたが、コマンドラインでAntを使用してテストを実行した場合のみです。
Antをデバッグモード(ant -d
)このステートメントに注意してください:
[junit] Implicitly adding /usr/share/ant/lib/junit4.jar:...
私の場合、このJARはテストの実行時にクラスパスの最後に追加され、AntスクリプトのJUnit参照を上書きしました。
私のAntインストールには、一連の古いJUnitライブラリがバンドルされていることがわかりました。 Antクラスパスを有効にするために、上記のjunit4.jarを削除する必要がありました。
Eclipseでまったく同じ問題に直面しましたが、所定の手順に従って解決しました
出来上がり...問題は解消しました。
JUnit 4.11、Ant、Ivyでも同じ問題が発生しました。このコードは私にとっては機能しますが、libフォルダーにhamcrest-core-1.3.jar(jUnit 4.11の場合)があることを確認する必要があります。
<property name="lib.dir">lib</property>
<property name="test.dir">src/test/Java</property>
<property name="build.test">build/test/Java</property>
<path id="test.path.id">
<path location="${build.test}" />
<path refid="lib.path.id" />
</path>
<path id="lib.path.id">
<fileset dir="${lib.dir}" />
</path>
<!-- =================================
Runs Tests
================================= -->
<target name="junit">
<junit>
<classpath refid="test.path.id" />
<batchtest>
<fileset dir="${test.dir}" />
</batchtest>
<formatter type="plain" usefile="false" />
</junit>
</target>
私は同じ問題を抱えており、クラスパスを変更するために多くの方法を試しました。私にとって最も簡単な解決策は、junitターゲットでパラメーターfork = "no"を使用することでした。 Eclipseは私よりも「自動的に」それをうまくできるようです...
私はhamcrestとjunit jarファイルをJava/lib/extディレクトリに追加しましたが、それでうまくいきました。
欠落しているクラスは、バージョン4.4以降のjunitに含まれています( link )。
古いバージョンのjUnitがクラスパスにあるかどうかを確認してください。コマンドシェルでAntスクリプトを実行して、同じエラーが発生するかどうかを確認してください。もしそうなら、おそらくantは4.4より古いjUnitバージョンを使用しています
更新:
ANT_HOMEフォルダーを確認します。 build.xmlファイルを右クリックし、「実行」ダイアログで2番目の「Antビルド」を選択します。 Ant実行構成を編集するためのダイアログが開きます(これを開く簡単な方法があるかもしれません)。 [クラスパス]タブに移動します。最新のjunitをクラスパス(antのlibフォルダー)に追加します。
トップレベルからEclipseのインストールディレクトリを検索して、「hamcrest。jar」を探しました(hamcrestの周りのワイルドカード '*'がこのWeb投稿に表示されていません)。次に、見つかったjarファイルをAnt build.xmlのクラスパスに追加しました。修繕。
Run-> Run As-> JUnit Testからjunitテストを実行しようとしたときにこの問題が発生しました(チェックしたところ、最新のjunitプラグイン(junit4_4.5.0)がインストールされています)。
Eclipseインストールのメインディレクトリに新しいディレクトリ(externalJars)を作成し、そこに最新のjunit jar(4.8.1)をダウンロードしました。
次に、Eclipseから、プロジェクトを選択して、ビルドパス(プロジェクト->プロパティ-> Javaビルドパス)のjarファイルを変更しました。最初にjunitを試したときに、 plugin/org.junit4_4.5.0.v20090824フォルダーからのjunit jarファイル。このjarファイルを削除して、externalJars/junit-4.8.1.jar(ダウンロードしたばかりのファイル)をビルドパスに追加しました。外部ジャーを追加」ボタンをクリックします。
hamcrest.orgは「マッチャー」のライブラリです。あなたは情報を見つけることができます:
http://code.google.com/p/hamcrest/
マッチャーオブジェクト(制約または述語とも呼ばれます)のライブラリーを提供し、「一致」ルールを宣言的に定義して、他のフレームワークで使用できるようにします。典型的なシナリオには、テストフレームワーク、モックライブラリ、UI検証ルールが含まれます。
Hamcrestは、Java、C++、Objective-C、PythonおよびPhPに移植されています。
注:Hamcrestはテストライブラリではありません。マッチャーがテストに非常に役立つということが起こります。
OK。ようやくこの問題を回避しました。何が起こっているのかまだまだ混乱しているので、「解決済み」とは言いません。とにかく...
最新のAnt(1.7.1)とJUnit(4.6)をダウンロードして、ワークスペースやEclipse内ではなく、外部ディレクトリに展開しました。
次に、Windows/Preferences/Ant/Runtime/Classpath/Ant Home Entriesに移動して、既存の(デフォルト)値をすべて削除します。新しくダウンロードしたAnt libディレクトリの内容に置き換えました。
次に、ダウンロードしたjunit.jarをGlobal Entriesに追加しました。 Eclipseに含まれているjunit.jarと同じように、org.hamcrestクラスが含まれているため、これが必要な理由はわかりませんが、必要です。
それでおしまい。ビルドファイルのjunitタスクは完全に機能します。
JUnit 4.5には、マッチングシステムの一部としてHamcrestが含まれています。クラスパスにもそのJARファイルがあることを確認する必要があります。
同様の問題があり、\ libフォルダーに "hamcrest-core-1.3.jar"のコピーを配置することで解決しました。
Eclipseでは、これはProperties->Libaries->Add External JARs...
を使用してjunit jarを追加すると発生します
Properties->Libaries->Add Library...
を使用する代わりに、Junit3 or Junit4
およびhamcrestライブラリを自動的に追加をパスに選択できます。
JUnit jarをAntクラスパスに追加する必要があるとは思いません。代わりに、Javaビルドパス(Windows/Preferences/Java/Build Path/Classpath Variables)にJUnitライブラリがあることを確認してください。