Atom
you must create a file named AtomTest.java
.
The ClassNameTest.java file must begin with the following line:
import junit.framework.*;
and must include a class declaration of the following form:
So, continuing with the example above, AtomTest.java
would initially contain the following:
import junit.framework.*; public class AtomTest extends TestCase { }
(Note: Don't worry if you haven't studied specialization and, so,
don't understand the meaning of extends TestCase
. It
doesn't matter for what follows.)
The file ClassNameTest.java must contain (at least) one
method for every method in ClassName. In particular, if there
is a method named MethodName in ClassName then you must
add a public void
method named testMethodName to
ClassNameTest.java. So, still continuing with the example
above, if the Atom
class contains a public int
getAtomicNumber()
method, then AtomTest.java
must
implement the following method:
/** * Unit tests for the getAtomicNumber() method */ public void testGetAtomicNumber() { }
Note the use of "camel case" in the naming of this method. Though the
'g' in getAtomicNumber()
is lowercase, the 'G' in
testGetAtomicNumber
is uppercase.
The body of the methods in the ClassNameTest.java must contain
the test cases for the corresponding methods in the ClassName
class. These test cases often involve some "setup" code and a call to
the Assert.assertEquals()
method. So, for example, the
getAtomicNumber
method in the Atom
class is
supposed to return the atomic number of the calling Atom
object. To partially test this method one might implement the
testGetAtomicNumber()
method in the
AtomTest
class as follows:
/** * Unit tests for the getAtomicNumber() method */ public void testGetAtomicNumber() { Atom o; o = new Atom("O", 8, 16); Assert.assertEquals("Oxygen", 8, o.getAtomicNumber()); }
In the "setup" portion, this method creates an Atom
objects (for oxygen). It then calls the
Assert.assertEquals()
method to tell jUnit to do some testing.
This particular version of the Assert.assertEquals()
method is
passed three parameters and has the following syntax:
The Description is a human-readable String
that provides information that enables the tester to understand the
test in the event that the code fails the test.
The ExpectedValue contains
the correct value (i.e., the value that the tester expects if the
method named MethodName in ClassName is working
correctly. The ActualValue contains the value that was
actually generated by the method named MethodName in
ClassName.
In the example above, the getAtomicNumber()
method in the
Atom
class is being tested. A call to
o.getAtomicNumber()
should
return 8
.
As another example, suppose the Atom
class contains a
public boolean equals(Atom other)
method, then
AtomTest.java
must implement the
following method:
/** * Unit tests for the equals(Atom) method */ public void testEquals() { }
Note that, even though the equals()
method in the
Atom
class is passed an Atom
object and
returns a boolean
, the testEquals()
method in
AtomTest.java
has no parameters an does not return anything.
The equals()
method in the Atom
class is supposed to compare the
calling Atom
object with the given Atom
object
and return true
if the two have the same attributes and
false
otherwise. To partially test the equals()
method, one might implement the testEquals()
method in the
AtomTest
class as follows:
/** * Unit tests for the equals(Atom) method */ public void testEquals() { Atom h, o; h = new Atom("H", 1, 1); o = new Atom("O", 8, 16); Assert.assertEquals("Compare H and O", false, h.equals(o)); }
The equals(Atom)
method in the Atom
class is
being tested. A call to h.equals(o)
should return
false
.
Assert.assertEquals()
method can be used to compare the
expected and actual values of a wide variety of different types. In
the examples above it is used to compare int
values
and boolean
values. It can also be used to
compare String
objects.
When using Assert.assertEquals()
to compare floating point
numbers (e.g., double
values), one must be careful. In
general, one should not use the ==
operator
with double
values because of the less-than-perfect
precision of operations on double
values.
In JUnit, the implication of this is that one should check to see
if double
values are within a tolerance value of each other.
Hence, when comparing double
values one should use
the following:
It can also be integrated into other IDEs, including:
Copyright 2019