19

我正在尝试使用 ant 运行我的 junit 测试。使用 JUnit 4 测试套件开始测试。如果我直接从 Eclipse 运行此测试,则测试完成而不会出错。但是,如果我从 ant 运行它,那么许多测试都会失败,并且会一遍又一遍地重复此错误,直到 junit 任务崩溃。

    [junit] java.util.zip.ZipException:打开 zip 文件时出错
    [junit] 在 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] 在 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] 在 sun.reflect.GeneratedMethodAccessor1.invoke(未知来源)
    [junit] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    [junit] 在 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" 依赖="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="单元测试失败"/>
    </目标>

我已验证类路径包含以下内容以及所有程序代码和库:

ant-junit.jar
ant-launcher.jar
蚂蚁罐子
easymock.jar
easymockclassextension.jar
junit-4.4.jar

我尝试调试以找出它试图打开的 ZipFile 没有运气,我尝试切换includeantruntimefork,我尝试使用ant -lib test/libs运行 ant,其中 test/libs 包含 ant 和 junit图书馆。

任何有关导致此异常的原因或您如何配置 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 的 [文件] 的显式引用而引起的。对“打开 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

听起来路径有问题。

检查以下错误来源:

  • classpath:在junit测试中打印出classpath变量,从eclipse和ant中运行,这样就可以比较
  • 检查您的项目的绝对路径。可能,ant 使用 eclipse 以外的其他路径前缀。

更多信息将有助于帮助:)

祝你好运!

于 2009-01-20T14:23:21.310 回答
0

谢谢你们提供这些信息。我只是想根据我的经验添加一些提示。当 junit 尝试在 *.jar 所在的 lib 文件夹中打开 license*.txt 文件时,我对 junit 有同样的问题。(常春藤解析过程将它们放在这里)所以

<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 回答