代码之家  ›  专栏  ›  技术社区  ›  chillitom Cee McSharpface

配置ant以运行单元测试。图书馆应该在哪里?类路径应该如何配置?避免ZipException

  •  19
  • chillitom Cee McSharpface  · 技术社区  · 17 年前

    我正在尝试使用ant运行junit测试。测试使用JUnit4测试套件开始。如果我直接从Eclipse运行这个测试,那么测试将毫无错误地完成。然而,如果我从ant运行它,那么许多测试都会失败,这个错误会一次又一次地重复,直到junit任务崩溃。

        [junit] java.util.zip.ZipException: error in opening zip file
        [junit]     at java.util.zip.ZipFile.open(Native Method)
        [junit]     at java.util.zip.ZipFile.(ZipFile.java:114)
        [junit]     at java.util.zip.ZipFile.(ZipFile.java:131)
        [junit]     at org.apache.tools.ant.AntClassLoader.getResourceURL(AntClassLoader.java:1028)
        [junit]     at org.apache.tools.ant.AntClassLoader$ResourceEnumeration.findNextResource(AntClassLoader.java:147)
        [junit]     at org.apache.tools.ant.AntClassLoader$ResourceEnumeration.nextElement(AntClassLoader.java:130)
        [junit]     at org.apache.tools.ant.util.CollectionUtils$CompoundEnumeration.nextElement(CollectionUtils.java:198)
        [junit]     at sun.misc.CompoundEnumeration.nextElement(CompoundEnumeration.java:43)
        [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.checkForkedPath(JUnitTask.java:1128)
        [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.executeAsForked(JUnitTask.java:1013)
        [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.execute(JUnitTask.java:834)
        [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.executeOrQueue(JUnitTask.java:1785)
        [junit]     at org.apache.tools.ant.taskdefs.optional.junit.JUnitTask.execute(JUnitTask.java:785)
        [junit]     at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)
        [junit]     at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
        [junit]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        [junit]     at java.lang.reflect.Method.invoke(Method.java:597)
        [junit]     at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
        [junit]     at org.apache.tools.ant.Task.perform(Task.java:348)
        [junit]     at org.apache.tools.ant.Target.execute(Target.java:357)
        [junit]     at org.apache.tools.ant.Target.performTasks(Target.java:385)
        [junit]     at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1337)
        [junit]     at org.apache.tools.ant.Project.executeTarget(Project.java:1306)
        [junit]     at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
        [junit]     at org.apache.tools.ant.Project.executeTargets(Project.java:1189)
        [junit]     at org.apache.tools.ant.Main.runBuild(Main.java:758)
        [junit]     at org.apache.tools.ant.Main.startAnt(Main.java:217)
        [junit]     at org.apache.tools.ant.launch.Launcher.run(Launcher.java:257)
        [junit]     at 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="Unit tests failed"/>
        </target>
    

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

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

    我尝试过调试,以找出它试图打开的ZipFile没有运气,我尝试过切换 包含时间 ant-lib测试/libs 其中test/libs包含ant和junit库。

    我们非常感谢您提供有关导致此异常的原因或如何配置ant以成功运行单元测试的任何信息。

    Ant1.7.1(ubuntu)、Java1.6.0_10、JUnit4.4

    谢谢

    更新-修复 我发现了我的问题。我使用一个文件集而不是pathelement将我的classes目录包含在我的路径中,这导致.class文件作为ZipFile打开,这当然引发了一个异常。

    5 回复  |  直到 13 年前
        1
  •  15
  •   chillitom Cee McSharpface    17 年前

    我发现了我的问题。我已使用 文件集 路径元素 这导致.class文件作为ZipFiles打开,这当然会引发异常。

        2
  •  9
  •   parris    16 年前

    造成此错误的具体原因是,类路径包含对一个或多个非JAR的[文件]的显式引用。“打开zip文件时出错”的引用当然是,JAR实际上是一个zip文件,正如其他文件[JUNIT]所发现的一样,类文件也是

    因此,在构建类路径(在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>
    

    注意:使用通配符时,如 [**/*]

    <fileset id="my.file.set" dir="c:/where/i/keep/my/jars">
        <include name="**/*.jar" />
    </fileset>
    
        3
  •  2
  •   guerda    17 年前

    听起来好像路径有问题。

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

    祝你好运

        4
  •  0
  •   Alexei    16 年前

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

    也有帮助。

        5
  •  0
  •   Nowaker    14 年前

    如果您使用的是Ubuntu或Debian,这将使JUnit(以及其他一些LIB)始终可用于Ant:

    sudo apt-get install ant-optional