Pertanyaan Ant + JUnit = ClassNotFoundExceptions saat menjalankan tes?


Saya mencoba menjalankan beberapa pengujian di Ant saat ini menggunakan JUnit, dan semua pengujian saya gagal dengan stacktrace berikut:

java.lang.ClassNotFoundException: com.mypackage.MyTestCase

Itu tidak terlalu masuk akal bagiku. Saya pertama kali mengkompilasi kasus pengujian saya menggunakan <javac>, lalu langsung menjalankan <junit> tugas untuk menjalankan tes. Buildfile saya terlihat seperti ini:

<target name="compile.webapp.tests" depends="compile.webapp">
    <javac srcdir="${test.java.src.dir}"
            destdir="${test.java.bin.dir}">
        <classpath>
            <filelist>
                <file name="${red5.home}/red5.jar"/>
                <file name="${red5.home}/boot.jar"/>
                <file name="${bin.dir}/${ant.project.name}.jar"/>
            </filelist>
            <fileset dir="${red5.lib.dir}" includes="**/*"/>
            <fileset dir="${main.java.lib.dir}" includes="**/*"/>
            <fileset dir="${test.java.lib.dir}" includes="**/*"/>
        </classpath>
    </javac>
</target>

<target name="run.webapp.tests" depends="compile.webapp.tests">
    <junit printsummary="true">
        <classpath>
            <filelist>
                <file name="${red5.home}/red5.jar"/>
                <file name="${red5.home}/boot.jar"/>
                <file name="${bin.dir}/${ant.project.name}.jar"/>
            </filelist>
            <fileset dir="${red5.lib.dir}" includes="**/*.jar"/>
            <fileset dir="${main.java.lib.dir}" includes="**/*.jar"/>
            <fileset dir="${test.java.lib.dir}" includes="**/*.jar"/>
            <fileset dir="${test.java.bin.dir}" includes="**/*.class"/>
        </classpath>

        <formatter type="xml"/>

        <batchtest todir="${test.java.output.dir}">
            <fileset dir="${test.java.bin.dir}" includes="**/*TestCase*"/>
        </batchtest>
    </junit>

    <junitreport>
        <fileset dir="${test.java.output.dir}" includes="**/*"/>
        <report todir="${test.java.report.dir}"/>
    </junitreport>
</target>

Ini benar-benar aneh, aku tidak bisa memperbaikinya. Apakah ada yang saya lakukan salah di sini? Tata letak direktori proyek saya terlihat seperti ini:

${basedir}/src/test/java # this is "test.java.src.dir"
${basedir}/build/test/java # this is "test.java.bin.dir"
${basedir}/lib/main/java # this is "main.java.lib.dir"
${basedir}/lib/test/java # this is "test.java.lib.dir"
${basedir}/build/test/junit # this is "test.java.output.dir"

Buildfile lengkap saya tersedia di sini: http://pastebin.com/SVnciGKR 
File properti saya tersedia di sini: http://pastebin.com/9LCtNQUq


MEMPERBARUI

Dengan memodifikasi target saya agar terlihat seperti di bawah ini, saya bisa membuat semuanya berjalan lancar. Sayangnya, saya harus secara manual menanamkan ant-junit.jar dan junit.jar ke dalam repositori saya, tetapi itu berhasil, jadi saya kira ini memecahkannya. Jika ada yang bisa membantu saya menyingkirkan kebutuhan untuk menanamkan ant-junit.jar dan junit.jar, saya akan sangat menghargainya:

<path id="webapp.tests.path" >
    <pathelement location="${red5.home}/red5.jar"/>
    <pathelement location="${red5.home}/boot.jar"/>
    <pathelement location="${bin.dir}/${ant.project.name}.jar"/>
    <pathelement path="${red5.lib.dir}"/>
    <pathelement path="${main.java.lib.dir}"/>
    <pathelement path="${test.java.lib.dir}"/>
</path>

<target name="compile.webapp.tests" depends="compile.webapp">
    <javac srcdir="${test.java.src.dir}"
            destdir="${test.java.bin.dir}">
        <classpath refid="webapp.tests.path"/>
    </javac>
</target>

<target name="run.webapp.tests" depends="compile.webapp.tests">     
    <junit printsummary="true">
        <classpath>
            <path refid="webapp.tests.path"/>
            <pathelement location="${test.lib.dir}/ant/ant-junit.jar"/>
            <pathelement location="${test.lib.dir}/ant/junit-4.8.2.jar"/>
            <pathelement path="${test.java.bin.dir}"/>
        </classpath>

        <formatter type="xml"/>

        <batchtest todir="${test.java.output.dir}">
            <fileset dir="${test.java.bin.dir}" includes="**/*TestCase*"/>
        </batchtest>
    </junit>

    <junitreport todir="${test.java.report.dir}">
        <fileset dir="${test.java.output.dir}" includes="**/*"/>
        <report todir="${test.java.report.dir}"/>
    </junitreport>

    <delete file="${test.java.report.dir}/TESTS-TestSuites.xml"/>
</target>

Jika saya tidak menyertakan guci di classpath, saya mendapat error yang memberitahukan saya bahwa junit.jar harus berada di classpath untuk menjalankan <junit> tugas. Aneh, ya?


4
2018-04-21 20:12


asal


Jawaban:


Menurut dokumentasi ANT untuk JUnit Task Anda harus melakukan salah satu opsi berikut untuk mendapatkan tes junit agar berjalan karena ada ketergantungan pada junit.jar yang merupakan eksternal dari ANT:

Catatan: Anda harus memiliki junit.jar   tersedia. Anda dapat melakukan salah satu dari:

  1. Taruh junit.jar dan ant-junit.jar di ANT_HOME / lib.
  2. Jangan masukkan ANT_HOME / lib, dan masukkan lokasinya   variabel lingkungan CLASSPATH Anda.
  3. Tambahkan kedua JAR ke classpath Anda menggunakan -lib.
  4. Tentukan lokasi dari kedua Guci menggunakan elemen dalam a    dalam file build.
  5. Tinggalkan ant-junit.jar di lokasi asalnya di ANT_HOME / lib tetapi sertakan   junit.jar dalam diteruskan ke   <junit>. (sejak Ant 1.7)

Saya telah memverifikasi bahwa # 1, menempatkan junit.jar di ANT_HOME \ lib bekerja (ant-junit.jar sudah ada di sana, ANT 1.8.0) dan saya tidak perlu untuk menentukan junit.jar di classpath untuk tag JUNIT. Intinya Anda mengambil opsi # 5.


4
2018-05-29 12:57



Saya pikir ini masalahnya:

<junit printsummary="true">
  <classpath>
    ...
    <fileset dir="${test.java.bin.dir}" includes="**/*.class"/>
  </classpath>

Saya yakin classpath seharusnya tidak termasuk file .class secara langsung, hanya root dari direktori bin.

<junit printsummary="true">
  <classpath>
    ...
    <pathelement path="${test.java.bin.dir}"/>
  </classpath>

Cara yang baik untuk melakukan debug ini adalah dengan menjalankan build Anda secara verbos dan memeriksa classpath secara seksama untuk memastikannya diatur bagaimana Anda mengharapkannya diatur. Lihat Semut opsi baris perintah  -verbose dan mungkin -debug.

Saya terkejut mengatur set classpath dengan hanya fileset dan file elemen, bukan pathelements. Lihatlah manual Ant pada Struktur Jalur-seperti untuk contoh untuk melihat apa yang saya maksud.

Akhirnya, duplikasi antara classpaths in javac dan junit dapat menyebabkan masalah di masa depan. Anda mungkin akan menginginkannya nama jalur atau kumpulan jalur tertentu sehingga Anda tidak akan menduplikasinya. Lihat panduan Ant Referensi.


3
2018-04-21 22:39



Anda perlu mereferensikan $ {test.java.bin.dir} di classpath tugas junit Anda.

Edit: Hmm, jika dengan "masih gagal" maksud Anda dengan kesalahan yang sama, maka tebakan saya berikutnya adalah bahwa sesuatu harus kacau tentang di mana direktori root relatif ke tempat paket dimulai, tapi saya perlu tahu lebih banyak tentang direktori Anda struktur untuk memastikan.


0
2018-04-21 20:16