Reputation: 6566
I'm trying to create a Proof of concept for the actual application, The task is to run ant-junit tests without adding stuff to the global environment. I've achieved it so far in ant, but, I'm stuck with the following exception. ClassTest.java is the java class that has sample unit testcase. (Junit 3.0 style). I'm not sure why ant-junit does not find the class inspite of mentioning the paths in the batchrun task.
project structure
I get the following exception when running ant-junit task.
Testsuite: ClassTest
Tests run: 1, Failures: 0, Errors: 1, Time elapsed: 0 sec
Caused an ERROR
ClassTest
java.lang.ClassNotFoundException: ClassTest
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:249)
at org.eclipse.ant.internal.launching.remote.EclipseSingleCheckExecutor.executeTargets(EclipseSingleCheckExecutor.java:30)
at org.eclipse.ant.internal.launching.remote.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
at org.eclipse.ant.internal.launching.remote.InternalAntRunner.run(InternalAntRunner.java:424)
at org.eclipse.ant.internal.launching.remote.InternalAntRunner.main(InternalAntRunner.java:138)
My ant build.xml file is
<project name="Java project build" default="build">
<property name="project.local.directory" value="C:\Users\usrpao\workspace\Ant" />
<property name="src.path" value="${project.local.directory}/src" />
<property name="lib.path" value="${project.local.directory}/lib" />
<property name="dest.path" value="${project.local.directory}/target" />
<property name="junit.output.dir" value="${project.local.directory}/junit" />
<path id="classpath.test">
<fileset dir="lib">
<include name="**/*.jar" />
</fileset>
</path>
<!--<taskdef name="junit" classname="org.apache.tools.ant.taskdefs.optional.junit.JUnitTask">
<classpath refid="classpath.test" />
</taskdef> -->
<path id="MyProject.classpath">
<pathelement location="lib/ant-junit.jar" />
<pathelement location="lib/junit.jar" />
<pathelement location="bin/*.*"/>
</path>
<path id="lib.classpath">
<pathelement location="lib/ant-junit.jar" />
<pathelement location="lib/junit.jar" />
</path>
<target name="build" depends="clean">
<javac srcdir="${src.path}" destdir="${dest.path}" classpathref="lib.classpath">
</javac>
<antcall target="test">
</antcall>
</target>
<target name="clean">
</target>
<target name="test">
<pathconvert property="testoutput" refid="classpath.test" />
<echo>Path = ${testoutput}</echo>
<mkdir dir="${junit.output.dir}" />
<junit haltonerror="false" showoutput="true">
<classpath refid="MyProject.classpath">
</classpath>
<batchtest todir="${junit.output.dir}">
<formatter type="plain" />
<fileset dir="${src.path}/com/ant/test">
<include name="**/*Test*.java" />
</fileset>
</batchtest>
</junit>
</target>
Upvotes: 0
Views: 998
Reputation: 72844
Your classpath is referencing the bin
directory while the classes are actually under the target
directory. You should change the MyProject.classpath
reference to include ${project.local.directory}/target
:
<path id="MyProject.classpath">
<pathelement location="lib/ant-junit.jar" />
<pathelement location="lib/junit.jar" />
<dirset dir="${project.local.directory}">
<include name="target"/>
</dirset>
</path>
In addition, you should change the fileset
element inside the junit
task by removing the folders corresponding to the package name of the test class, otherwise you will still get a ClassNotFoundException
:
<junit haltonerror="false" showoutput="true">
<classpath refid="MyProject.classpath">
</classpath>
<batchtest todir="${junit.output.dir}">
<formatter type="plain" />
<fileset dir="${src.path}"> <!-- remove com/ant/test corresponding to package name -->
<include name="**/*Test*.java" />
</fileset>
</batchtest>
</junit>
Upvotes: 1
Reputation: 9946
From your folder structure it is evident that the class ClassTest.class
is in target
folder. so in class-path
you should include following:
<pathelement path="target"/>
Hope this helps.
Upvotes: 0