Pregunta

[Editar] Solucionado, pequeño error cometido por ser un principiante de hormigas. En el objetivo de prueba, debe ser <classpath refid="my.classpath"/> en lugar de <classpath id="my.classpath"/>. Eso obviamente sobrescribió mi propiedad classpath definida. Eso deja en claro que hormiga no puede encontrar la biblioteca. Nota para mí: rtfm! [/ Edit]

Primero lo primero: estoy usando Ant 1.7.1 y JUnit 4.7.

Esto me molesta desde hace bastantes horas. Tengo un proyecto de Netbeans (6.7.1). En el proyecto agregué fuentes de prueba, ahora me gustaría invocar las pruebas desde hormiga. Así que tengo el siguiente archivo de hormiga:

<?xml version="1.0" encoding="UTF-8"?>

<project name="LiveStreamClient" default="clean-build" basedir=".">
<description>Builds, tests, and runs the project.</description>
<property name="src.dir"        value="src"/>
<property name="build.dir"      value="build"/>
<property name="classes.dir"    value="${build.dir}/classes"/>
<property name="test.classes.dir" value="${build.dir}/classes/livestreamclient"/>
<property name="jar.dir"        value="${build.dir}/jar"/>    
<property name="report.dir"     value="${build.dir}/junitreport"/>
<property name="lib.dir"        value="lib"/>
<property name="test.dir"       value="test"/>

<property name="main.class"     value="livestreamclient.Main"/>
<property name="VERSION"        value="0.1."/>

<path id="my.classpath">
    <fileset dir="${lib.dir}" includes="**/*.jar"/>
    <pathelement location="${classes.dir}"/>
   <!-- <pathelement location="${test.classes.dir}" />
    <pathelement location="${test.dir}" /> -->
</path>

<!-- increment the build number -->    
<buildnumber/>

<!-- clean deletes complete build directory -->
<target name="clean">
    <delete dir="${build.dir}"/>
</target>

<!-- compile classes -->
<target name="compile">
    <mkdir dir="${classes.dir}"/>
    <javac srcdir="${src.dir}" destdir="${classes.dir}"/>
    <!-- <javac srcdir="${test.dir}" destdir="${classes.dir}"/> -->
</target>

<!-- pack as java archive -->
<target name="jar" depends="compile">
    <mkdir dir="${jar.dir}"/>
    <jar destfile="${jar.dir}/${ant.project.name}${VERSION}${build.number}.jar" basedir="${classes.dir}">
        <manifest>
            <attribute name="Main-Class" value="${main.class}"/>
        </manifest>
    </jar>
</target>

<!-- run the test classes -->    
<target name="test" depends="jar">
    <mkdir dir="${report.dir}"/>
    <junit printsummary="yes">
        <classpath id="my.classpath"/>
        <formatter type="plain"/>
        <batchtest fork="yes" todir="${report.dir}">
            <fileset dir="${test.dir}">
                <include name="**/*Test*"/>
            </fileset>
        </batchtest>
    </junit> 
</target>

<!-- JUnit testing report -->    
<target name="junitreport">
    <junitreport todir="${report.dir}">
        <fileset dir="${report.dir}" includes="Test-*.xml"/>
        <report todir="${report.dir}"/>
    </junitreport>
</target>

<!-- run the jar -->
<target name="run" depends="jar">
    <java jar="${jar.dir}/${ant.project.name}${VERSION}${build.number}.jar" fork="true"/>
</target>

<target name="commit" depends="run">
  <exec executable="hg">
    <arg value="ci"/>
    <arg value="-m"/>
    <arg value="TESTCOMMIT"/>
  </exec>
</target>


<!-- default target -->
<target name="clean-build" depends="clean,jar"/>

<target name="main" depends="clean,run"/>

Mi enfoque es probar por lotes los archivos de prueba (más por venir) en la carpeta test.dir, que hasta ahora solo contiene la siguiente clase de prueba:

package livestreamclient.modeltest;

import org.junit.*;
import static org.junit.Assert.*;
import livestreamclient.model.*;

public class LiveStreamModelTest {
    @Test
    public void testCreation() {
        LiveStreamModel model = new LiveStreamModel();
        assertFalse(1 == 2);
    }

}

El archivo de prueba reside en la carpeta test, mientras que la fuente real está dentro de la carpeta src, ya que así es como NetBeans maneja la estructura por defecto.

Ant me da ClassDefNotFoundException para el archivo de prueba en la tarea JUnit ... Pero la clase está en la carpeta deseada. ¿Me estoy perdiendo algo conceptual aquí?

EDITAR:

El seguimiento de excepción creado en el informe junit es el siguiente:

Testsuite: livestreamclient.modeltest.LiveStreamModelTest
Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec

Caused an ERROR
livestreamclient.modeltest.LiveStreamModelTest
java.lang.ClassNotFoundException: livestreamclient.modeltest.LiveStreamModelTest
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:169)
¿Fue útil?

Solución

A ClassDefNotFoundError significa que el cargador de clases puede cargar una clase X pero no puede crear una instancia porque no puede cargar las clases de las que depende la clase X.

Entonces, en su caso, verifique que el JAR de JUnit 4 (de las clases LiveStreamModelTest depende) esté realmente en el classpath cuando ejecute las pruebas. Compruebe también que está utilizando Ant 1.7+ (que se requiere para JUnit 4 AFAIK).

Otros consejos

También es posible que haya algo mal con la clase de prueba en sí; por ejemplo, si hay una excepción lanzada en un inicializador estático, obtendrá un ClassDefNotFoundError. Intente verificar por otros medios (depurador, código de prueba) que la clase funciona como se esperaba.

Intente agregar el JUnit 4 JAR a su directorio Ant / lib.

Intente agregar la etiqueta de ruta como esta ... esto resolvió mi problema.

<path id="classpath" description="Classpath do Projeto">
    <fileset dir="${LIB}">
        <include name="**/*.jar" />
        <exclude name="**/.SVN/*.*"/>
    </fileset>
</path>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top