蚂蚁的JUnit的ClassNotFoundException(Ant JUnit ClassNot

2019-09-23 13:38发布

我知道有很多类似的问题,因为这一次 ,读数超过他们大多不过之后我似乎有同样的问题,但出于不同的原因。

我运行一个<junit>我的Ant构建中的任务,我得到一个ClassNotFoundException 。 在大多数的类似相关的问题(如上面的一个),这原来是不同程度的作者干脆不正确配置了JUnit类路径。 虽然它很可能是同一对我来说,没有任何的建议,任何这些其他问题都为我工作。

我的项目目录结构:

MyProject/
    src/main/java/
        FakeObject.java
        ...the rest of my Java main source
    src/test/java
        FakeObjectUnitTest.java
        ...the rest of my Java test source
    bin/main
        FakeObject.class
        ...the rest of main Java binaries
    bin/test
        FakeObjectUnitTest.class
        ...the rest of main Java binaries
    lib/main
        ...my main dependencies
    lib/test
        junit-4.10.jar
        hamcrest-1.1.jar
        ...the rest of my test dependencies
    gen/reports
        ...where JUnit should be placing all test reports
    build/
        build.xml
        build.properties

src/test/java/FakeObjectUnitTest.java

// Package and imports omitted

public class FakeObjectUnitTest {
    @Test
    public void doSomething() {
        int x = 5;

        Assert.assertEquals(x, 5);
    }
}

build.xml

<project name="" basedir="..">
    <!-- Main classpath. -->
    <path id="main.class.path">
        <fileset dir="bin/main"/>
    </path>

    <!-- Test classpath. -->
    <path id="test.class.path">
        <fileset dir="bin/test"/>
    </path>

    <!-- JUnit classpath. -->
    <path id="junit.class.path">
        <fileset dir="lib/main" includes="*.jar"/>
        <fileset dir="lib/test" includes="*.jar"/>
        <path refid="main.class.path"/>
        <path refid="test.class.path"/>
    </path>

    <!--
        All previous targets omitted for brevity (such as for compiling, etc.), but
    I assure you all that they work and compile FakeObject.java/FakeObjectUnitTest.java into
    FakeObject.class/FakeObjectUnitTest.class respectively, and place them in the correct
bin directories.
    -->

    <target name="run-junit" depends="compile">

        <property name="junit.path" refid="junit.class.path"/>
        <echo message="JUnit ClassPath is: ${junit.path}"/>

        <junit printsummary="yes" haltonerror="yes" haltonfailure="yes">
            <classpath refid="junit.class.path"/>

            <formatter type="xml"/>

            <batchtest todir="gen/reports">
                <fileset dir="src/test/java">
                    <include name="**/*UnitTest*.java"/>
                </fileset>
            </batchtest>
        </junit>
    </target>
</project>

当我运行在命令行这一目标:

run-junit:
    [echo] Conducting unit tests with JUnit.
    [echo] JUnit ClassPath is: /<path-to-my-project>/MyProject/lib/test/hamcrest-1.1.jar:/<path-to-my-project>/MyProject/lib/test/junit-4.10.jar:/<path-to-my-project>/MyProject/bin/main/com/myproject/client/FakeObject.class:/<path-to-my-project>/MyProject/bin/test/com/myproject/client/FakeObjectUnitTest.class
    [junit] Running com.myproject.client.FakeObjectUnitTest
    [junit] Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec

我这样做是为了证明它看到FakeObjectUnitTest.class在JUnit的类路径。 但是,因错误而失败。 当我进入本次测试的XML测试报告,我看到以下内容:

<error message="com.myproject.client.FakeObjectUnitTest" type="java.lang.ClassNotFoundException">java.lang.ClassNotFoundException: com.myproject.client.FakeObjectUnitTest
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:247)
</error>

当我在详细模式下运行Ant( -v )我看到的唯一线索是一堆的线沿线的警告:

忽略异常java.util.zip.ZipException:在打开zip文件的阅读资源X错误

...其中x是一个类文件的名称。

我发现这对SO问题,这个问题竟然是,提交人添加的类文件到classpath,而不是JAR文件(这使得JUnit的不高兴)。 所以我试图消除main.class.pathtest.class.pathjunit.class/path ,然后我得到一个异常,没有一个类文件中都可以找到。

至于什么任何意见或想法是怎么回事? 在此先感谢,并为遗憾-v这里的问题,但我想通了更多的细节,就更好了。

Answer 1:

您需要使用的包状结构:
从手册 :

无论路径样值需要被指定的,可以使用一个嵌套元件。 这需要的一般形式:

  <classpath> <pathelement path="${classpath}"/> <pathelement location="lib/helper.jar"/> </classpath> 

所以,你的解决办法是这样的:

<!-- JUnit classpath. -->
<path id="junit.class.path">
    <fileset dir="lib/main" includes="*.jar"/>
    <fileset dir="lib/test" includes="*.jar"/>
    <pathelement location="bin/main"/>
    <pathelement location="bin/test"/>
</path>


Answer 2:

看着你的类路径:

...:/<path-to-my-project>/MyProject/bin/main/com/myproject/client/FakeObject.class:...

你不能把个人类这样的类路径。 相反,把那在类路径中包的层次结构的基础目录:

...:/<path-to-my-project>/MyProject/bin/main:...


Answer 3:

使运行JUnit的目标修改如下,

         <batchtest todir="gen/reports">
            <fileset dir="bin/tests">
                <include name="**/*UnitTest*.class"/>
            </fileset>
         </batchtest>


文章来源: Ant JUnit ClassNotFoundException