26

わかりました、私はイライラしています!私は何時間も探し回りましたが、まだ困惑しています。

環境: 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 にあります。.class ファイルは ${basedir}/bin にあります。

Windows / Preferences / Ant / Runtime / Contributed Entries を介して eclipse-install-dir/plugins/org.junit4_4.5.0.v20090423/junit.jar を Ant ランタイム クラスパスに追加しました。ant-junit.jar は Ant Home Entries にあります。

では、この非常に複雑なターゲットを実行するとどうなるでしょうか? 私のレポートファイルには以下が含まれています:

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 クラスとは何ですか? モックと何か関係がありますか?いいよ。しかし、なぜ依存関係があるのですか?私はそれで何もしていません。これは文字通り、JUnit 以外に依存関係のない Java プロジェクトです。

困った(そしてイライラした)!!

4

15 に答える 15

14

JUnit 4.7 をダウンロードし、ビルド パスに (古いバージョンではなく) junit-4.7.jar を配置しました。それで解決しました。アリには触れませんでした。

于 2009-09-20T19:22:25.990 に答える
9

hamcrest.jar もテスト クラスパスに追加します。

于 2009-07-23T11:59:25.847 に答える
8

コマンドラインでAntを使用してテストを実行した場合にのみ、同じ問題の理由が見つかりました。

Ant をデバッグ モード ( ant -d) で実行し、次のステートメントに注意してください。

[junit] Implicitly adding /usr/share/ant/lib/junit4.jar:...

私の場合、この JAR は、テストの実行時にクラスパスの最後に追加され、Ant スクリプトの JUnit 参照をオーバーライドしました。

私のAntインストールには、古いJUnitライブラリのセットがバンドルされていることが判明しました。Ant クラスパス参照を有効にするために、上記の junit4.jar を削除する必要がありました。

于 2010-06-14T11:24:28.713 に答える
3

日食でまったく同じ問題に直面しましたが、与えられた手順に従って問題を解決しました

  1. [設定]に移動します| Java | JUnit
  2. 「パッケージの追加」をクリックして、「org.hamcrest。*」を追加します

出来上がり...問題はなくなった..

于 2012-02-03T21:00:32.273 に答える
2

私は同じ問題を抱えていて、クラスパスを変更するために多くの方法を試しました。私にとって最も簡単な解決策は、junit ターゲットでパラメーター fork="no" を使用することでした。Eclipseは「自動的に」私よりもうまくやれるようです...

于 2009-08-23T15:24:22.620 に答える
2

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>
于 2013-06-21T11:45:31.027 に答える
2

hamcrest および junit jar ファイルを java/lib/ext ディレクトリに追加したところ、問題なく動作しました。

于 2013-08-12T13:05:10.737 に答える
1

欠落しているクラスは、バージョン 4.4 以降の junit に含まれています (リンク)。

古いバージョンの jUnit がクラスパスにあるかどうかを確認してください。コマンド シェルで ant スクリプトを実行して、同じエラーが発生するかどうかを確認してください。もしそうなら、おそらく ant は 4.4 より古いバージョンの jUnit を使用しています

アップデート:

ANT_HOME フォルダーを見てください。build.xml ファイルを右クリックし、Run As.. ダイアログで 2 番目の「Ant build」を選択します。Ant 実行構成を編集するためのダイアログが開きます (これを開く簡単な方法があるかもしれません)。[クラスパス] タブに移動します。クラスパス (ant の lib フォルダー) に最新の junit を追加します。

于 2009-07-23T12:03:46.693 に答える
1

Eclipse のインストール ディレクトリをトップ レベルから検索して、" hamcrest .jar" を探しました (hamcrest を囲むワイルドカード '*' は、この Web 投稿には表示されません)。次に、見つかった jar ファイルを Ant build.xml のクラスパスに追加しました。修理済み。

于 2009-11-12T17:03:28.387 に答える
1

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 ファイルを削除し、[Add External Jars] ボタンをクリックして、externalJars/junit-4.8.1.jar (ダウンロードしたばかりのもの) をビルド パスに追加しました。

hamcrest.org は「マッチャー」のライブラリです。次の場所で情報を見つけることができます。

http://code.google.com/p/hamcrest/

マッチャー オブジェクト (制約または述語とも呼ばれます) のライブラリを提供して、「一致」ルールを宣言的に定義し、他のフレームワークで使用できるようにします。典型的なシナリオには、フレームワークのテスト、ライブラリのモック、UI 検証ルールが含まれます。

Hamcrest は、Java、C++、Objective-C、Python、および PhP に移植されています。

注: Hamcrest はテスト ライブラリではありません。たまたまマッチャーがテストに非常に役立つ場合があります。

于 2010-02-04T15:17:07.190 に答える
0

わかった。私はついにこの問題を回避しました。何が起こっているのかまだかなり混乱しているので、「解決した」とは言いません。ともかく...

最新のAnt(1.7.1)とJUnit(4.6)をダウンロードし、それらを外部ディレクトリに展開しました。ワークスペース内やEclipse内ではありません。

次に、Windows/設定/Ant/ランタイム/クラスパス/Antホームエントリに移動し、既存の(デフォルトの)値をすべて強制終了します。それらを新しくダウンロードしたAntlibディレクトリの内容に置き換えました。

次に、ダウンロードしたjunit.jarをグローバルエントリに追加しました。Eclipseに含まれているjunit.jarと同じように、org.hamcrestクラスが含まれているので、なぜこれが必要なのかわかりませんが、必要です。

それでおしまい。ビルドファイルのjunitタスクは完全に機能します。

于 2009-07-23T15:20:12.310 に答える
0

AntクラスパスにJUnitjarを追加する必要はないと思います。代わりに、Javaビルドパス(Windows / Preferences / Java / Build Path / Classpath Variables)にJUnitライブラリがあることを確認してください。

于 2009-07-23T12:38:00.927 に答える
0

JUnit 4.5 には、マッチング システムの一部として Hamcrest が含まれています。クラスパスにもそのJARファイルがあることを確認する必要があります

于 2009-07-23T11:59:59.387 に答える
0

Eclipse では、これは、Properties->Libaries->Add External JARs...

which を使用するのではなく、hamcrest ライブラリProperties->Libaries->Add Library...を選択Junit3 or Junit4して自動的にパスに追加できます。

于 2013-07-05T17:32:55.757 に答える