Problems With Apache Ant Tutorial - JUnit

I am trying to execute apache ANT:

http://ant.apache.org/manual/index.html

I am currently participating in JUnit, but keep getting errors related to being unable to find the junit.framework package.

I believe that I followed the textbook like this: here are the details:

----- My file structure -----

build.xml /build ../classes /lib ..log4j-1.2.8.jar myManifest /src ..HelloWorldTest.java ..log4j.properties ../oata ....HelloWorld.java 

----- Sources -----

myManifest:

 Main-Class: oata.HelloWorld 

build.xml

 <project name ="HelloWorld" basedir="." default="main"> <property name="src.dir" value="src" /> <property name="build.dir" value="build" /> <property name="classes.dir" value="${build.dir}/classes" /> <property name="jar.dir" value="${build.dir}/jar" /> <property name="lib.dir" value="lib" /> <path id="classpath"> <fileset dir="${lib.dir}" includes="**/*.jar" /> </path> <property name="main-class" value="oata.HelloWorld" /> <target name="clean"> <delete dir="${build.dir}"/> </target> <target name="compile"> <mkdir dir="${classes.dir}"/> <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" /> <copy todir="${classes.dir}" > <fileset dir="${src.dir}" excludes="**/*.java" /> </copy> </target> <target name="jar" depends="compile"> <mkdir dir="${jar.dir}" /> <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}"> <manifest> <attribute name="Main-Class" value="${main-class}" /> </manifest> </jar> </target> <target name="run" depends="jar"> <java fork="true" classname="${main-class}"> <classpath> <path refid="classpath"/> <path id="application" location="${jar.dir}/${ant.project.name}.jar"/> </classpath> </java> </target> <target name="junit" depends="jar"> <junit printsummary="yes"> <classpath> <path refid="classpath"/> <path refid="application"/> </classpath> <batchtest fork="yes"> <fileset dir="${src.dir}" includes="*Test.java"/> </batchtest> </junit> </target> <target name="clean-build" depends="clean,jar" /> <target name="main" depends="clean,run" /> </project> 

HelloWorldTest.java:

 public class HelloWorldTest extends junit.framework.TestCase { public void testNothing() { } public void testWillAlwaysFail() { fail("An error message"); } } 

HelloWorld.java

 package oata; import org.apache.log4j.Logger; public class HelloWorld { static Logger logger = Logger.getLogger(HelloWorld.class); public static void main(String [] args){ logger.info("Hello World!"); } } 

log4j.properties:

 log4j.rootLogger=DEBUG, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%m%n 

--- Output ---

  ant -verbose junit Apache Ant(TM) version 1.8.2 compiled on June 20 2012 Trying the default build file: build.xml Buildfile: /Users/jtyler/Projects/AntHelloWorld/build.xml Detected Java version: 1.6 in: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home Detected OS: Mac OS X parsing buildfile /Users/jtyler/Projects/AntHelloWorld/build.xml with URI = file:/Users/jtyler/Projects/AntHelloWorld/build.xml Project base dir set to: /Users/jtyler/Projects/AntHelloWorld parsing buildfile jar:file:/usr/share/ant/lib/ant.jar!/org/apache/tools/ant/antlib.xml with URI = jar:file:/usr/share/ant/lib/ant.jar!/org/apache/tools/ant/antlib.xml from a zip file Build sequence for target(s) `junit' is [compile, jar, junit] Complete build sequence is [compile, jar, junit, clean, run, main, clean-build, ] compile: [mkdir] Skipping /Users/jtyler/Projects/AntHelloWorld/build/classes because it already exists. [javac] /Users/jtyler/Projects/AntHelloWorld/build.xml:20: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds [javac] HelloWorldTest.java added as HelloWorldTest.class doesn't exist. [javac] /Users/jtyler/Projects/AntHelloWorld/src/log4j.properties skipped - don't know how to handle it [javac] oata/HelloWorld.java added as oata/HelloWorld.class doesn't exist. [javac] Compiling 2 source files to /Users/jtyler/Projects/AntHelloWorld/build/classes [javac] Using modern compiler [javac] Compilation arguments: [javac] '-d' [javac] '/Users/jtyler/Projects/AntHelloWorld/build/classes' [javac] '-classpath' [javac] '/Users/jtyler/Projects/AntHelloWorld/build/classes:/Users/jtyler/Projects/AntHelloWorld/lib/log4j-1.2.8.jar:/usr/share/ant/lib/ant-launcher.jar:/usr/share/ant/lib/ant-antlr.jar:/usr/share/ant/lib/ant-jmf.jar:/usr/share/ant/lib/ant-junit.jar:/usr/share/ant/lib/ant-junit4.jar:/usr/share/ant/lib/ant-swing.jar:/usr/share/ant/lib/ant-testutil.jar:/usr/share/ant/lib/ant.jar' [javac] '-sourcepath' [javac] '/Users/jtyler/Projects/AntHelloWorld/src' [javac] '-g:none' [javac] [javac] The ' characters around the executable and arguments are [javac] not part of the command. [javac] Files to be compiled: [javac] /Users/jtyler/Projects/AntHelloWorld/src/HelloWorldTest.java [javac] /Users/jtyler/Projects/AntHelloWorld/src/oata/HelloWorld.java [javac] /Users/jtyler/Projects/AntHelloWorld/src/HelloWorldTest.java:1: package junit.framework does not exist [javac] public class HelloWorldTest extends junit.framework.TestCase { [javac] ^ [javac] /Users/jtyler/Projects/AntHelloWorld/src/HelloWorldTest.java:7: cannot find symbol [javac] symbol : method fail(java.lang.String) [javac] location: class HelloWorldTest [javac] fail("An error message"); [javac] ^ [javac] 2 errors BUILD FAILED /Users/jtyler/Projects/AntHelloWorld/build.xml:20: Compile failed; see the compiler error output for details. at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:1150) at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:912) at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) at org.apache.tools.ant.Task.perform(Task.java:348) at org.apache.tools.ant.Target.execute(Target.java:390) at org.apache.tools.ant.Target.performTasks(Target.java:411) at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399) at org.apache.tools.ant.Project.executeTarget(Project.java:1368) at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41) at org.apache.tools.ant.Project.executeTargets(Project.java:1251) at org.apache.tools.ant.Main.runBuild(Main.java:809) at org.apache.tools.ant.Main.startAnt(Main.java:217) at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280) at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109) Total time: 0 seconds 

Is there something I am missing that needs to be included, which was (or was not) mentioned in the textbook?

EDIT . Based on Alex polls, I tested if I have ANT junit jars in my shared directories (what I do):

 $ ls /usr/share/ant/lib/ant-junit*.jar /usr/share/ant/lib/ant-junit.jar /usr/share/ant/lib/ant-junit4.jar 

I also tried manually putting ant -junit, ant -junit4.jar and junit.jar in the directory of my lib project with the following results (all errors) after running ant clean JUnit

  • junit.jar - / Users / jtyler / Projects / AntHelloWorld / build.xml: 45: Link not found.
  • ant -junit.jar: junit.framework package does not exist
  • ant -junit.jar and ant.junit4.jar: junit.framework package does not exist
  • ant -junit4.jar: junit.framework package does not exist

EDIT All error when only junit.jar is included in the lib folder and the call to ant clean junit is called :

 $ ant clean junit Buildfile: /Users/jtyler/Projects/AntHelloWorld/build.xml clean: [delete] Deleting directory /Users/jtyler/Projects/AntHelloWorld/build compile: [mkdir] Created dir: /Users/jtyler/Projects/AntHelloWorld/build/classes [javac] /Users/jtyler/Projects/AntHelloWorld/build.xml:20: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds [javac] Compiling 2 source files to /Users/jtyler/Projects/AntHelloWorld/build/classes [copy] Copying 1 file to /Users/jtyler/Projects/AntHelloWorld/build/classes jar: [mkdir] Created dir: /Users/jtyler/Projects/AntHelloWorld/build/jar [jar] Building jar: /Users/jtyler/Projects/AntHelloWorld/build/jar/HelloWorld.jar junit: BUILD FAILED /Users/jtyler/Projects/AntHelloWorld/build.xml:45: Reference application not found. 
+4
source share
3 answers

Besides the junit.jar file in my lib directory, I added the following line to my build.xml file right above the junit task declaration:

 <path id="application" location="${jar.dir}/${ant.project.name}.jar"/> 

which is a copy of the application path identifier declaration, in the definition of the "run" task.

The application works successfully, and I get the following output with ant junit (expected to fail during testing):

 ant junit Buildfile: /Users/jtyler/Projects/AntHelloWorld/build.xml compile: [javac] /Users/jtyler/Projects/AntHelloWorld/build.xml:20: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds jar: junit: [junit] Running HelloWorldTest [junit] Tests run: 2, Failures: 1, Errors: 0, Time elapsed: 0.001 sec [junit] Test HelloWorldTest FAILED BUILD SUCCESSFUL Total time: 1 second 

Comments will be welcomed with the following questions:

  • I really need to include the junit.jar file in the lib folder, what should I worry about? I would suggest that this is not necessary if the ant tutorial explicitly states: "Since ant has built-in JUnit 3.8.2, you can start using it directly."

  • Is the fact that I need to determine the identifier of the path "application" outside of the definition of the startup task a typo in the apache ant tutorial? Or are there other things that I missed or should consider?

Thanks to everyone who helped.

+2
source

The textbook is misleading. The junit files included in ant do not work. I downloaded juinit and copied the jar file to the lib folder of the project, and now it works fine.

+3
source

You must specify junit.jar yourself in your compilation and in your path to the <junit> task class. This will not be automatically included in your compiler:

 <!-- Contains junit.jar and other needed test classes --> <path id="junit.classpath"> <fileset dir="${junit.directory}"/> </path> <!-- Contains third party jars your code is dependent upon --> <path id="main.classpath"> <fileset dir="${dependent.jar.dir}"/> </path> <!-- Your main Java source code directory --> <property name="main.srcdir" value="${basedir}/src/main/java"/> <!-- Your main Junit test directory source code --> <property name="test.srcdir" value="${basedir}/src/test/java"/> <!-- Where you're compiling your main classes to --> <property name="main.destdir" value="${basedir}/target/classes"/> <!-- Where you're compiling your test classes to --> <property name="test.destdir" value="${basedir}/target/test-classes"/> [...] <!-- Compile Test Classes --> <!-- Notice you have three classpath elements: * Your main classes you compiled before * Your test main classpath that your main classes were dependent up * The junit.jar classpath --> <javac destdir="${test.destdir}" srcdir="${test.srcdir}"> <classpath> <!-- Your non-test classes you compiled before --> <pathelement path="${main.destdir}/> </classpath> <classpath refid="junit.classpath"/> <classpath refid="main.classpath"/> </javac> <!-- Now run your unit tests: Note how you have the same three classpath elements as before --> <junit fork="yes"> <classpath> <pathelement path="${main.destdir}"/> <pathelement path="${test.destdir}"/> </classpath> <classpath refid="main.classpath"/> <classpath refid="junit.classpath"/> [...] </junit> 
+1
source

Source: https://habr.com/ru/post/1444427/


All Articles