Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Configuring ant to run unit tests. Where should libraries be? How should classpath be configured? avoiding ZipException

Tags:

java

junit

ant

I'm trying to run my junit tests using ant. The tests are kicked off using a JUnit 4 test suite. If I run this direct from Eclipse the tests complete without error. However if I run it from ant then many of the tests fail with this error repeated over and over until the junit task crashes.

    [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)

my test running task is as follows:

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

I've verified that the classpath contains the following as well as all of the program code and libraries:

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

I've tried debugging to find out which ZipFile it is trying to open with no luck, I've tried toggling includeantruntime and fork and i've tried running ant with ant -lib test/libs where test/libs contains the ant and junit libraries.

Any info about what causes this exception or how you've configured ant to successfully run unit tests is gratefully received.

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

Thanks.

Update - Fixed Found my problem. I had included my classes directory in my path using a fileset as opposed to a pathelement this was causing .class files to be opened as ZipFiles which of course threw an exception.

like image 450
chillitom Avatar asked Jan 20 '09 14:01

chillitom


2 Answers

Found my problem. I had included my classes directory in my path using a fileset as opposed to a pathelement this was causing .class files to be opened as ZipFiles which of course threw an exception.

like image 95
chillitom Avatar answered Nov 10 '22 01:11

chillitom


This error is caused specifically because the class path contains explicit references to one or more [files] that are not JAR's. The reference to "error in opening zip file" is of course that a JAR is in effect a ZIP file where as other files [JUNIT] has found like class files are not and as such do not have a zip format. So the class path should contain only explicit references to JAR [files] and/or the names of the [directories] where other resources like class files are to be found.

So when building up your class path (in ANT) use:

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

where

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

or

NOTE: When using wild cards like [**/*] in you need to make sure the wild card is not matching files that are not JAR files

<fileset id="my.file.set" dir="c:/where/i/keep/my/jars">
    <include name="**/*.jar" />
</fileset>
like image 9
parris Avatar answered Nov 10 '22 02:11

parris