运行junit测试时出现ZipException异常

9
我一直在努力让Ant执行一些用JUnit编写的测试,但是一直没有成功。如果您有任何建议,将不胜感激。我对Ant和Java都很陌生,请耐心指导。
简单来说,我正在尝试让Ant执行一个非常简单的测试,考虑到Ant -debug的输出,类路径看起来没问题。对于一个明确在类路径中提到其类文件的测试,我得到了一个空测试错误。此外,我还遇到了ZipException,我不知道这是什么原因。
以下是我正在尝试运行的测试用例:
package testmanagment;
import junit.framework.*;

public abstract class EasyTest extends TestCase
{

    public EasyTest(String name)
    {
        super(name);
    }

    protected void setUp()
    {}

    protected void testSeeMee() throws Exception
    {
        assertTrue(true);
    }

    protected void testSeeMeetoo() throws Exception
    {
        assertTrue(true);
    }   
}

这个软件包中有几个测试,这个测试只是为了查看为什么所有内容都失败了。它会因ZipException而失败。

这是我的make文件的一小部分:

  <property name="src" value="src/"/> 
     <property name="build" value="build/"/>  
     <property name="test" value="${build}test/"/>
     <property name="testreportsdir" value="${test}reports/"/>
     <property name="classdir" value="${build}classes/"/>
     <property name="lib" value="lib/"/> 

    <path id="files-classpath">  
        <fileset dir="lib/" >  
            <include name="*.jar"/>  
        </fileset>  
    </path> 

    <path id="tests-classpath">
        <path refid="files-classpath"/>
        <pathelement location="${classdir}/"/>
    </path>

    <path id="tests-runpath">
        <path refid="tests-classpath"/>
        <fileset dir="${test}/">
            <include name="*.class"/>
            <include name="**/*.class"/>
            <include name="testmanagment/*.class"/>
            <include name="*.*"/>
            <include name="**/*.*"/>
            <include name="testmanagment/*.*"/>
        </fileset>
        </path>

blah blah blah

    <target name="test" depends="compile_tests">
        <junit haltonfailure="true"  printsummary="false">
            <classpath refid="tests-runpath"/>
            <formatter type="brief" usefile="false"/>
            <test name="testmanagment.EasyTest"/>
            <test name="testmanagment.TestUser"/>
            <test name="testmanagment.TestTest"/>
                </junit>
    </target>

Ant编译一切正常,并且似乎将所有内容放在了正确的位置。但是它似乎找不到我的测试...这是当我使用-debug选项运行它时,Ant输出的一小段内容。

 [junit] Using CLASSPATH /host/Users/Sheena/Desktop/School/Software dev/lab_project/lib/junit-4.8.1.jar:/host/Users/Sheena/Desktop/School/Software dev/lab_project/lib/sqlitejdbc-v056.jar:/host/Users/Sheena/Desktop/School/Software dev/lab_project/build/classes:/host/Users/Sheena/Desktop/School/Software dev/lab_project/build/test/testmanagment/EasyTest.class:/host/Users/Sheena/Desktop/School/Software dev/lab_project/build/test/testmanagment/TestTest.class:/host/Users/Sheena/Desktop/School/Software dev/lab_project/build/test/testmanagment/TestUser.class:/usr/share/ant/lib/junit.jar:/usr/share/java/ant-launcher-1.7.1.jar:/usr/share/ant/lib/ant.jar:/usr/share/ant/lib/ant-junit.jar
Class org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter loaded from parent loader (parentFirst)
Finding class testmanagment.EasyTest
Ignoring Exception java.util.zip.ZipException: error in opening zip file reading resource testmanagment/EasyTest.class from /host/Users/Sheena/Desktop/School/Software dev/lab_project/build/test/testmanagment/EasyTest.class
Ignoring Exception java.util.zip.ZipException: error in opening zip file reading resource testmanagment/EasyTest.class from /host/Users/Sheena/Desktop/School/Software dev/lab_project/build/test/testmanagment/TestTest.class
Ignoring Exception java.util.zip.ZipException: error in opening zip file reading resource testmanagment/EasyTest.class from /host/Users/Sheena/Desktop/School/Software dev/lab_project/build/test/testmanagment/TestUser.class
    [junit] Testsuite: testmanagment.EasyTest
    [junit] Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec
    [junit] 
    [junit] Null Test:  Caused an ERROR

抱歉,输出结果看起来不太美观,但目前这是我所能使用的全部。

看起来测试用例在类路径中,所以我不知道发生了什么...也许与ZipException有关,但我不确定...


你在使用什么工具?你是否在使用带有ANT插件的IDE,例如Netbeans或Eclipse?它们应该在路径错误时生成警告。 - Spoike
2个回答

7

您将EasyTest.class作为JAR文件添加到类路径中。这样做是不行的。类文件并不是JAR存档文件,因此当类加载器尝试从中加载类时会抛出错误。


不,我使用<include name="testmanagment/*.class"/>来包含所有的.class文件,除非还有其他地方需要声明吗?看起来ant知道这是一个.class文件。 - Sheena
1
你不能将类文件添加到类路径中,只能添加包含包的目录。也就是说,如果你的类是 testmanagment.EasyTest,你应该添加包含 testmanagment/ 的文件夹,因为 Java 会自动将包名添加到搜索路径中。 - Aaron Digulla
我尝试使用FileSet,但无论是使用*.class还是只使用目录,都会出现ZipException。我也尝试了类似的PathElement方法,但它找不到文件。这真的有点烦人了。一定是打错字了,我就是找不到它。 - Sheena
4
不要使用 fileset,使用 <pathelement location="${classdir}"/> - Aaron Digulla
1
<dirset> 在添加目录到类路径时可以替代 <fileset>,但是 <path><pathelement> 更为现代化。 - Rhubarb
显示剩余4条评论

1

我假设你正在运行jUnit 3。你可以尝试创建一个不是抽象类的TestCase类。此外,必须有一个默认构造函数,否则jUnit将不知道如何创建测试类。

在你的情况下应该是:

package testmanagment; 

import junit.framework.*;

public class EasyTest extends TestCase {

    public EasyTest() {
        super("Easy Test");
    }

    public void setUp() {
    }

    public void testSeeMee() throws Exception {
        assertTrue(true);
    }

    public void testSeeMeetoo() throws Exception {
        assertTrue(true);
    }   
}

我正在使用具体的3.8.2版本。去掉抽象关键字不会改变任何东西。 - Sheena
如何移除构造函数? - Spoike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接