Frage

[Bearbeiten] Gelöst, kleine Fehler gemacht von mir eine Ameise Anfänger zu sein. Im Test Ziel muss es <classpath refid="my.classpath"/> statt <classpath id="my.classpath"/> werden. Das überschrieb offensichtlich meine definiert Classpath Eigenschaft. Das macht deutlich, dass Ameise ist nicht in der Lage, die Bibliothek zu finden. Beachten Sie mir: RTFM [/ Edit]

Das Wichtigste zuerst:. Ich verwende Ant 1.7.1 und JUnit 4.7

Das stört mich für eine ganz fewhours jetzt. Ich habe ein Netbeans-Projekt (6.7.1) bekam. Im Projekt I Testquellen hinzugefügt, jetzt würde Ich mag die Prüfung von Ameise tun berufen. So habe ich die folgende ant-Datei bekommen:

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

Mein Ansatz ist es, die (mehr zu kommen) Testdateien im test.dir Ordner batchtest, die bisher nur die folgende Testklasse gilt:

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

}

Die Testdatei befindet sich im Ordner test, während die eigentliche Quelle innerhalb des src Ordner ist, wie das ist, wie NetBeans die Struktur standardmäßig behandelt.

Ant gibt mir ClassDefNotFoundException für die Testdatei in der JUnit Aufgabe ... Aber die Klasse ist in den gewünschten Ordner. Bin ich etwas fehlt konzeptuell hier?

EDIT:

Die Ausnahme Spur im junit Bericht erstellt ist die folgende:

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)
War es hilfreich?

Lösung

Ein ClassDefNotFoundError bedeutet, dass der Klassenlader eine Klasse X laden kann, aber es kann nicht instanziiert werden, weil es nicht die Klassen geladen werden kann, die Klasse X abhängt.

in Ihrem Fall also überprüfen, das JAR der JUnit 4 (die Klassen LiveStreamModelTest hängt davon ab) ist wirklich auf dem Classpath, wenn Tests ausgeführt werden. Prüfen Sie auch, dass Sie Ant 1.7+ verwenden (die für JUnit 4 AFAIK erforderlich).

Andere Tipps

Es ist auch möglich, dass es etwas falsch mit der Testklasse selbst; zum Beispiel, wenn es eine Ausnahme in einem statischen Initialisierer geworfen das Sie eine ClassDefNotFoundError bekommen. Versuchen Sie, um zu überprüfen, durch andere Mittel (Debugger, Test-Code), dass die Klasse arbeitet wie erwartet.

Versuchen Sie, die JUnit 4 JAR auf Ihre Ant / lib Verzeichnis.

Versuchen Sie, den Pfad-Tag wie folgt Hinzufügen ... das ist mein Problem gelöst.

<path id="classpath" description="Classpath do Projeto">
    <fileset dir="${LIB}">
        <include name="**/*.jar" />
        <exclude name="**/.SVN/*.*"/>
    </fileset>
</path>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top