Domanda

[Modifica] Risolto, piccolo errore fatto da me come principiante di formica. Nel target del test, deve essere <classpath refid="my.classpath"/> anziché <classpath id="my.classpath"/>. Ciò ovviamente ha sovrascritto la mia proprietà classpath definita. Ciò chiarisce che la formica non è in grado di trovare la libreria. Nota per me: rtfm! [/ Modifica]

Prima di tutto: sto usando Ant 1.7.1 e JUnit 4.7.

Questo ora mi dà fastidio per parecchie ore. Ho un progetto Netbeans (6.7.1). Nel progetto ho aggiunto fonti di test, ora vorrei invocare i test da formica. Quindi ho il seguente file di formica:

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

Il mio approccio è di testare in batch i file di test (più a venire) nella cartella test.dir, che finora contiene solo la seguente classe di test:

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

}

Il file di test risiede nella cartella test, mentre l'origine effettiva si trova nella cartella src, in questo modo NetBeans gestisce la struttura per impostazione predefinita.

Ant mi dà ClassDefNotFoundException per il file di test nell'attività JUnit ... Ma la classe è nella cartella desiderata. Mi sto perdendo qualcosa di concezionalmente qui?

EDIT:

La traccia dell'eccezione creata nel rapporto junit è la seguente:

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)
È stato utile?

Soluzione

A ClassDefNotFoundError indica che il programma di caricamento classi può caricare una classe X ma non può crearne un'istanza perché non può caricare le classi da cui dipende la classe X.

Quindi, nel tuo caso, controlla che il JAR di JUnit 4 (le classi LiveStreamModelTest dipendono) sia realmente sul percorso di classe quando esegui i test. Controlla anche che stai usando Ant 1.7+ (che è richiesto per JUnit 4 AFAIK).

Altri suggerimenti

È anche possibile che ci sia qualcosa di sbagliato nella classe di test stessa; ad esempio se viene generata un'eccezione in un inizializzatore statico si otterrà un ClassDefNotFoundError. Prova a verificare con altri mezzi (debugger, codice di prova) che la classe funzioni come previsto.

Prova ad aggiungere JAR JUnit 4 alla tua directory Ant / lib.

Prova ad aggiungere il tag percorso in questo modo ... questo ha risolto il mio problema.

<path id="classpath" description="Classpath do Projeto">
    <fileset dir="${LIB}">
        <include name="**/*.jar" />
        <exclude name="**/.SVN/*.*"/>
    </fileset>
</path>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top