9

これと似たような質問がたくさんあることに気づきましたが、それらのほとんどを読んだ後、私は同じ問題を抱えているようですが、理由は異なります。

<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

これは、JUnitクラスパスで認識されることを証明するために行います。FakeObjectUnitTest.classただし、エラーで失敗します。このテストのXMLTESTレポートに入ると、次のように表示されます。

<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:リソースxを読み取るzipファイルを開く際のエラー

...xクラスファイルの名前はどこにありますか。

私はSOでこの質問を見つけましたが、問題は、作成者がJARではなくクラスパスにクラスファイルを追加したことであることが判明しました(これによりJUnitは不幸になります)。そこで、とを削除しようとするとmain.class.path、クラスファイルが見つからないという例外が発生します。test.class.pathjunit.class/path

何が起こっているのかについてのアイデアや考えはありますか?よろしくお願いします。ここでの質問は申し訳ありませんが、-v詳細が多いほど良いと思いました。

4

3 に答える 3

7

パッケージのような構造に使用する必要があります:
マニュアルから

パスのような値を指定する必要がある場合は常に、ネストされた要素を使用できます。これは、次の一般的な形式を取ります。

    <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>
于 2012-10-05T11:53:59.247 に答える
3

クラスパスを見る:

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

そのようなクラスパスに個々のクラスを入れることはできません。代わりに、パッケージ階層のベースにあるディレクトリをクラスパスに配置します。

...:/<path-to-my-project>/MyProject/bin/main:...
于 2012-10-05T11:47:38.173 に答える
0

run-junitターゲットを次のように変更します。

         <batchtest todir="gen/reports">
            <fileset dir="bin/tests">
                <include name="**/*UnitTest*.class"/>
            </fileset>
         </batchtest>
于 2016-01-15T09:06:36.050 に答える