سؤال

[تحرير] محلولة، خطأ صغير قام به لي كونه مبتدئا النمل. في الهدف الاختبار، فإنه يحتاج إلى أن <classpath refid="my.classpath"/> بدلا من <classpath id="my.classpath"/>. أن overwrote الواضح ملكيتي CLASSPATH محددة. وهذا يجعل من الواضح أن النمل ليست قادرة على العثور على المكتبة. لاحظ لي: RTFM [/ عدل]

وأول الأشياء أولا: أنا باستخدام 1.7.1 النملة وأداة JUnit 4.7

وهذا يزعجني لfewhours تماما الآن. أنا عندي مشروع نتبيانس (6.7.1). في المشروع أضفت مصادر الاختبار، والآن أود أن تفعل استدعاء اختبار من النمل. حتى لقد حصلت على ملف النمل التالية:

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

وتوجهي هو batchtest و(المزيد في المستقبل) testfiles في المجلد test.dir، التي تتولى فقط الطبقة الاختبار التالي حتى الآن:

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

}

وملف اختبار موجود في المجلد test، في حين أن المصدر الفعلي هو داخل مجلد src، وهذه هي الطريقة التي يعالج نتبيانس هيكل افتراضيا.

والنملة يعطيني ClassDefNotFoundException لملف اختبار في مهمة أداة JUnit ... لكن الطبقة في المجلد المطلوب. أنا في عداد المفقودين شيء conceptionally هنا؟

وتحرير:

وتتبع استثناء إنشاؤها في التقرير أداة JUnit هو ما يلي:

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)
هل كانت مفيدة؟

المحلول

وA ClassDefNotFoundError يعني أن classloader يمكن تحميل فئة X ولكن لا يمكن إنشاء مثيل لأنه لا يمكن تحميل الطبقات تلك الفئة X يعتمد على.

وهكذا، في الحالة الخاصة بك، تأكد من أن أداة JUnit 4 في JAR (وLiveStreamModelTest الطبقات يعتمد على) هو حقا على CLASSPATH عند تشغيل الاختبارات. تحقق أيضا من أنك تستخدم 1.7+ النملة (وهو مطلوب لأداة JUnit 4 AFAIK).

نصائح أخرى

ومن الممكن أيضا أن هناك شيء خاطئ مع فئة اختبار نفسه. على سبيل المثال إذا كان هناك استثناء القيت في مهيئ ثابت وستحصل على ClassDefNotFoundError. محاولة التحقق من خلال بعض وسائل أخرى (المصحح، رمز اختبار) أن الطبقة تعمل كما هو متوقع.

وحاول إضافة JAR أداة JUnit 4 إلى النملة الدليل / ليب.

وحاول إضافة علامة مسار من هذا القبيل ... هذا حل مشكلتي.

<path id="classpath" description="Classpath do Projeto">
    <fileset dir="${LIB}">
        <include name="**/*.jar" />
        <exclude name="**/.SVN/*.*"/>
    </fileset>
</path>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top