Question

[Modifier] Résolu, petite erreur commise lorsque je suis un débutant. Dans la cible de test, il doit être <classpath refid="my.classpath"/> au lieu de <classpath id="my.classpath"/>. Cela a évidemment écrasé ma propriété de chemin de classe définie. Cela indique clairement que fourmi n'est pas capable de trouver la bibliothèque. Note pour moi: rtfm! [/ Edit]

Tout d’abord: j’utilise Ant 1.7.1 et JUnit 4.7.

Cela me dérange pendant quelques heures maintenant. J'ai un projet Netbeans (6.7.1). Dans le projet, j'ai ajouté des sources de test. J'aimerais maintenant appeler les tests ant. J'ai donc le fichier ant suivant:

<?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"/>

Mon approche consiste à tester par lots les fichiers de test (à venir) dans le dossier test.dir, qui ne contient que la classe de test suivante:

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);
    }

}

Le fichier de test réside dans le dossier test, alors que la source réelle se trouve dans le dossier src, car c'est ainsi que NetBeans gère la structure par défaut.

Ant me donne ClassDefNotFoundException le fichier de test dans la tâche JUnit ... Mais la classe se trouve dans le dossier souhaité. Est-ce que je manque quelque chose de façon conceptuelle ici?

EDIT:

La trace d'exception créée dans le rapport Junit est la suivante:

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)
Était-ce utile?

La solution

Un ClassDefNotFoundError signifie que le chargeur de classes peut charger une classe X mais ne peut pas l'instancier car il ne peut pas charger les classes dont dépend la classe X.

Donc, dans votre cas, vérifiez que le fichier JAR de JUnit 4 (dont dépendent les classes LiveStreamModelTest) est bien sur le chemin de classe lors de l'exécution des tests. Vérifiez également que vous utilisez Ant 1.7+ (requis pour JUnit 4 AFAIK).

Autres conseils

Il est également possible qu'il y ait un problème avec la classe de test elle-même; Par exemple, si une exception est levée dans un initialiseur statique, vous obtiendrez un ClassDefNotFoundError. Essayez de vérifier par d’autres moyens (débogueur, code de test) que la classe fonctionne comme prévu.

Essayez d’ajouter le fichier JAR JUnit 4 à votre répertoire Ant / lib.

Essayez d’ajouter la balise path comme ceci ... cela résout mon problème.

<path id="classpath" description="Classpath do Projeto">
    <fileset dir="${LIB}">
        <include name="**/*.jar" />
        <exclude name="**/.SVN/*.*"/>
    </fileset>
</path>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top