Ant Junit任务抛出java.lang.ClassNotFoundException

时间:2018-08-03 09:52:53

标签: java eclipse junit ant

我有一个简单的Junit测试,不断抛出java.lang.ClassNotFoundException。下面是文件夹结构

project:
|__build.xml
|__hamcrest-core-1.3.jar
|__junit.jar
|__src:
|  |__Simple.java
|__bin:
   |__Simple.class

Simple.java
import org.junit.Test;

public class Simple {
    @Test
    public void check() {
        assert (true);
    }
}

build.xml

<?xml version="1.0"?>
<project name="Ant-Test" default="main">
    <target name="main">
        <junit printsummary="yes" fork="yes" haltonfailure="no">
            <classpath path="hamcrest-core-1.3.jar" />
            <classpath path="junit.jar" />
            <formatter type="plain" />
            <batchtest fork="yes" todir="docs">
                <fileset dir="bin">
                    <include name="**.class" />
                </fileset>
            </batchtest>
        </junit>
    </target>
</project>

Error:
Testsuite: Simple
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0 sec
Caused an ERROR
Simple
java.lang.ClassNotFoundException: Simple
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:292)

请帮助我找到发生此错误的原因。该脚本能够找到测试用例,但最终会引发错误。

3 个答案:

答案 0 :(得分:0)

请尝试使用以下文件集标记:

<fileset dir="bin">                  
    <include name="**.java" />
</fileset>

答案 1 :(得分:0)

Add the required resources to the test classpath

<pathelement path="${classpath}"/>

您的情况将是:

<classpath>
   <pathelement path="bin" />
   <pathelement location="hamcrest-core-1.3.jar" />
   <pathelement location="junit.jar" />
</classpath>

here

所述
  

为了使事情变得更加灵活,我们添加了一项额外的功能,可以匹配多个目录级别。这可用于匹配完整的目录树或目录树中任何位置的文件。为此,必须使用“ ”作为目录名称。当**用作模式中目录的名称时,它与零个或多个目录匹配。例如:/ test / 匹配/ test /下的所有文件/目录,例如/test/x.java或/test/foo/bar/xyz.html,但不匹配/xyz.xml。

'**'必须用于匹配文件夹,而不是用于选择部分文件名的通配符。 更改您的蚂蚁:

<fileset dir="bin">
    <include name="*.class" />
</fileset>

如果要选择bin /下每个目录下的所有“ * .class”文件,请使用:

<fileset dir="bin">
    <include name="**/*.class" />
</fileset>

现在,测试报告编写者将导致错误原因。您需要创建一个docs文件夹,然后一切正常。

最终的build.xml将是:

<?xml version="1.0"?>
<project name="Ant-Test" default="main">
    <target name="main">
        <mkdir dir="docs"/>
        <junit printsummary="yes" fork="yes" haltonfailure="no">
            <classpath location="hamcrest-core-1.3.jar" />
            <classpath location="junit-4.12.jar" />
            <classpath path="bin/" />
            <formatter type="plain" />
            <batchtest fork="yes" todir="docs">
                <fileset dir="bin">
                    <include name="**/*.class" />
                </fileset>
            </batchtest>
        </junit>
    </target>
</project>

答案 2 :(得分:0)

我不确定junit任务是否允许多个classpath节点,但是无论如何,最好只有一个节点。此外,您的类路径缺少 classes 目录。正确的声明将是这样的:

<junit ...>
    <classpath>
        <pathelement path="bin"/>
        <pathelement location="hamcrest-core-1.3.jar"/>
        <pathelement location="junit.jar"/>
    </classpath>
    ...
</junit>