19

antを使用してjunitテストを実行しようとしています。テストは、JUnit4テストスイートを使用して開始されます。これをEclipseから直接実行すると、テストはエラーなしで完了します。ただし、antから実行すると、junitタスクがクラッシュするまで、このエラーが何度も繰り返されて、テストの多くが失敗します。

    [junit] java.util.zip.ZipException:zipファイルを開く際のエラー
    [junit] at java.util.zip.ZipFile.open(ネイティブメソッド)
    [junit] java.util.zip.ZipFile。(ZipFile.java:114)
    [junit] java.util.zip.ZipFile。(ZipFile.java:131)
    [junit] org.apache.tools.ant.AntClassLoader.getResourceURL(AntClassLoader.java:1028)
    [junit] org.apache.tools.ant.AntClassLoader $ ResourceEnumeration.findNextResource(AntClassLoader.java:147)
    [junit] org.apache.tools.ant.AntClassLoader $ ResourceEnumeration.nextElement(AntClassLoader.java:130)
    [junit] org.apache.tools.ant.util.CollectionUtils $ CompoundEnumeration.nextElement(CollectionUtils.java:198)
    [junit] at sun.misc.CompoundEnumeration.nextElement(CompoundEnumeration.java:43)
    [junit] org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.checkForkedPath(JUnitTask.java:1128)
    [junit] org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.executeAsForked(JUnitTask.java:1013)
    [junit] org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.execute(JUnitTask.java:834)
    [junit] org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.executeOrQueue(JUnitTask.java:1785)
    [junit] org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.execute(JUnitTask.java:785)
    [junit] org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
    [junit] at sun.reflect.GeneratedMethodAccessor1.invoke(不明なソース)
    [junit] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    [junit] at java.lang.reflect.Method.invoke(Method.java:597)
    [junit] org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    [junit] org.apache.tools.ant.Task.perform(Task.java:348)で
    [junit] org.apache.tools.ant.Target.execute(Target.java:357)で
    [junit] org.apache.tools.ant.Target.performTasks(Target.java:385)で
    [junit] org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337)
    [junit] org.apache.tools.ant.Project.executeTarget(Project.java:1306)
    [junit] org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    [junit] org.apache.tools.ant.Project.executeTargets(Project.java:1189)
    [junit] org.apache.tools.ant.Main.runBuild(Main.java:758)で
    [junit] org.apache.tools.ant.Main.startAnt(Main.java:217)
    [junit] org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)で
    [junit] org.apache.tools.ant.launch.Launcher.main(Launcher.java:104)

私のテスト実行タスクは次のとおりです。

    <target name = "run-junit-tests"depends = "compile-tests、clean-results">
        <mkdir dir = "$ {test.results.dir}" />
        <junit failureproperty = "tests.failed" fork = "true" showoutput = "yes" includeantruntime = "false">
            <classpath refid = "test.run.path" />
            <formatter type = "xml" />
            <test name = "project.AllTests" todir = "$ {basedir} / test-results" />
        </ junit>
        <fail if = "tests.failed" message="ユニットテストに失敗しました"/>
    </ target>

クラスパスに次のものとすべてのプログラムコードおよびライブラリが含まれていることを確認しました。

ant-junit.jar
ant-launcher.jar
ant.jar
easymock.jar
easymockclassextension.jar
junit-4.4.jar

デバッグを試みて、運が悪かったときに開こうとしているZipFileを見つけ、includeantruntimeforkを切り替えて、 ant -lib test/libsでantを実行しようとしました。test /libsにはantとjunitが含まれています。ライブラリ。

この例外の原因や、単体テストを正常に実行するようにantを構成した方法に関する情報はすべてありがたく受け取られます。

ant 1.7.1(ubuntu)、java 1.6.0_10、junit 4.4

ありがとう。

更新-修正 済み問題が見つかりました。パス要素ではなくファイルセットを使用してクラスディレクトリをパスに含めたため、.classファイルがZipFilesとして開かれ、もちろん例外がスローされていました。

4

5 に答える 5

15

私の問題を見つけました。パス要素ではなく、ファイルセットを使用してクラスディレクトリをパスに含めていたため、.classファイルがZipFilesとして開かれ、もちろん例外がスローされました。

于 2009-01-20T15:30:04.313 に答える
9

このエラーは、JAR ではない 1 つ以上の [ファイル] への明示的な参照がクラス パスに含まれているために発生します。「zip ファイルを開く際のエラー」への言及は、もちろん、JAR は事実上 ZIP ファイルであり、[JUNIT] がクラス ファイルのように見つけた他のファイルはそうではなく、zip 形式を持たないということです。そのため、クラス パスには、JAR [ファイル] および/またはクラス ファイルなどの他のリソースが存在する [ディレクトリ] の名前への明示的な参照のみを含める必要があります。

したがって、(ANT で) クラスパスを構築するときは、次を使用します。

<path id="proj.class.path">
    <pathelement location="c:/my/project/root" />       :one for each of the [directories] where class files, log4j property files and other resources etc are to be found
    <fileset refid="my.file.set">                   :to describe all the explicit JAR [files] that need to be on the class path.
</path>

どこ

<fileset id="my.file.set" dir="c:/where/i/keep/my/jars">
    <filename name="myjar1.jar" />
    <filename name="myjar2.jar" />
    <filename name="myjar3.jar" />
</fileset>

また

注: のよう[**/*]にワイルド カードを使用する場合は、ワイルド カードが JAR ファイルではないファイルと一致していないことを確認する必要があります。

<fileset id="my.file.set" dir="c:/where/i/keep/my/jars">
    <include name="**/*.jar" />
</fileset>
于 2010-05-30T09:19:20.713 に答える
2

パスに問題があるようです。

次のエラー ソースを確認します。

  • クラスパス: junit テストでクラスパス変数を出力し、Eclipse と ant から実行して、それらを比較できるようにします。
  • プロジェクトの絶対パスを確認してください。おそらく、ant は eclipse 以外のパス プレフィックスを使用します。

いくつかの詳細情報が役立ちます:)

幸運を!

于 2009-01-20T14:23:21.310 に答える
0

この情報をありがとう。私の経験からのヒントを追加したいだけです。junit が *.jar が存在する lib フォルダー内の license*.txt ファイルを開こうとすると、junit で同じ問題が発生します (Ivy 解決プロセスはそれらをここに配置します)。

<path id="lib.path.id">
    <fileset dir="${lib.dir}" includes="**.jar"/>
</path>

も役立ちます。

于 2010-04-30T00:01:04.530 に答える
0

Ubuntu または Debian を使用している場合、これにより JUnit (および他のいくつかのライブラリ) が Ant で常に利用可能になります。

sudo apt-get install ant-optional
于 2011-12-18T01:18:19.743 に答える