문제

편집] 해결, 제가 개미 초보자가 된 작은 실수. 테스트 대상에서는해야합니다 <classpath refid="my.classpath"/> 대신에 <classpath id="my.classpath"/>. 그것은 분명히 내 정의 된 classpath 속성을 덮어 씁니다. 그것은 Ant가 라이브러리를 찾을 수 없다는 것을 분명히합니다. 나에게 참고 : rtfm! [/edit

가장 먼저 : ANT 1.7.1과 Junit 4.7을 사용하고 있습니다.

이것은 지금 꽤 많은 시간 동안 나를 귀찮게합니다. NetBeans 프로젝트 (6.7.1)가 있습니다. 프로젝트에서 테스트 소스를 추가했는데 이제 ANT에서 테스트를 호출하고 싶습니다. 그래서 나는 다음 ANT 파일을 가지고 있습니다.

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

내 접근 방식은 Test.Dir 폴더에서 (다가오는) TestFiles를 배치 테스트하는 것입니다.

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 폴더는 NetBeans가 기본적으로 구조를 처리하는 방식입니다.

개미가 나에게 준다 ClassDefNotFoundException Junit 작업의 테스트 파일의 경우 ... 그러나 클래스는 원하는 폴더에 있습니다. 여기에 개념적으로 뭔가 빠졌나요?

편집하다:

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)
도움이 되었습니까?

해결책

ClassDefNotFoundError 클래스 로더가 클래스 X를로드 할 수 있지만 클래스 X가 의존하는 클래스를로드 할 수 없기 때문에 인스턴스화 할 수는 없습니다.

따라서 귀하의 경우 Junit 4의 항아리 (클래스 LiveStreamModelTest 테스트를 실행할 때 실제로 클래스 경로에 의존합니다. 또한 ANT 1.7+ (Junit 4 Afaik에 필요한)를 사용하고 있는지 확인하십시오.

다른 팁

테스트 클래스 자체에 문제가있을 수도 있습니다. 예를 들어 정적 이니셜 라이저에 예외가 발생하면 ClassDefnotFoundError를 얻습니다. 클래스가 예상대로 작동하는 다른 수단 (디버거, 테스트 코드)을 통해 확인하십시오.

ant /lib 디렉토리에 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