Ant + JUnit: NoClassDefFoundError

2022-09-01 17:12:47

好吧,我很沮丧!我已经四处打猎了好几个小时,但仍然很困惑。

环境:WinXP,Eclipse Galileo 3.5(直接安装 - 没有额外的插件)。

所以,我有一个简单的JUnit测试。它从内部Eclipse JUnit运行配置中运行良好。此类不依赖于任何内容。为了尽可能地缩小这个问题的范围,它只包含:

@Test
public void testX() {
    assertEquals("1", new Integer(1).toString());
}

到目前为止没有出汗。现在我想采取超级高级的步骤,从Ant内部运行这个测试用例(最终目标是与Hudson集成)。

因此,我创建了一个构建.xml:

<project name="Test" default="basic">
    <property name="default.target.dir" value="${basedir}/target" />
    <property name="test.report.dir" value="${default.target.dir}/test-reports" />

    <target name="basic">
        <mkdir dir="${test.report.dir}" />
        <junit fork="true" printSummary="true" showOutput="true">
            <formatter type="plain" />
            <classpath>
                <pathelement path="${basedir}/bin "/>
            </classpath>
            <batchtest fork="true" todir="${test.report.dir}" >
                <fileset dir="${basedir}/bin">
                    <include name="**/*Test.*" />
                </fileset>
            </batchtest>
        </junit>
    </target>
</project>

${basedir} 是工作区中包含源代码、类和构建文件的 Java 项目名称。所有.java和构建.xml都在 ${basedir}/src 中。.class文件位于 ${basedir}/bin 中。

我已经通过Windows / Preferences / Ant / Runtime / Contribute Entries将eclipse-install-dir/plugins/org.junit4_4.5.0.v20090423/junit.jar添加到Ant Runtime Classpath中。ant-junit.jar在Ant Home Entrys中。

那么,当我运行这个极其复杂的目标时会发生什么呢?我的报告文件包含:

Testsuite: com.xyz.test.RussianTest
Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec

Testcase: initializationError took 0 sec
Caused an ERROR
org/hamcrest/SelfDescribing
java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.defineClass(Unknown Source)
    at java.net.URLClassLoader.access$000(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    Caused by: java.lang.ClassNotFoundException: org.hamcrest.SelfDescribing
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClassInternal(Unknown Source)

这个 org.hamcrest.SelfDescripting 类是什么?与模拟有什么关系?好的,好的。但为什么是依赖呢?我根本没有用它做任何事情。从字面上看,这是一个Java项目,除了JUnit之外没有其他依赖项。

被难住了(和沮丧)!!


答案 1

我下载了JUnit 4.7,并将junit-4.7.jar放在我的构建路径中(而不是旧版本)。这解决了它。我没有碰到蚂蚁。


答案 2

还将 hamcrest.jar 添加到测试类路径中


推荐