JUnitTerminologyOnce more, in picturesWriting a JUnit test class, IWriting a JUnit test class, IIA simple exampleAssert methods IExample: Counter classJUnit tests for CounterThe Counter class itselfWarning: equalsAssert methods IIAssert methods IIIWriting a JUnit test class, IIISpecial features of @TestTest-Driven Development (TDD)StubsIgnoring a testTest suitesJUnit in EclipseViewing results in EclipseRecommended approachThe EndJan 14, 2019JUnit2TerminologyA test fixture sets up the data (both objects and primitives) that are needed to run testsExample: If you are testing code that updates an employee record, you need an employee record to test it onA unit test is a test of a single classA test case tests the response of a single method to a particular set of inputsA test suite is a collection of test casesA test runner is software that runs tests and reports resultsAn integration test is a test of how well classes work togetherJUnit provides some limited support for integration tests3test suiteOnce more, in picturesA unit test tests the methods in a single classA test case tests (insofar as possible) a single methodYou can have multiple test cases for a single methodA test suite combines unit testsThe test fixture provides software support for all thisThe test runner runs unit tests or an entire test suiteIntegration testing (testing that it all works together) is not well supported by JUnitunit test (for one class)another unit testtest case (for one method)another test casetest case (for one method)another unit testanother test caseanother test caseanother test casetest fixturetest runneranother test case4Writing a JUnit test class, IStart by importing these JUnit 4 classes:import org.junit.*;import static org.junit.Assert.*; // note static importDeclare your test class in the usual waypublic class MyProgramTest {Declare an instance of the class being testedYou can declare other variables, but don’t give them initial values herepublic class MyProgramTest { MyProgram program; int someVariable;5Writing a JUnit test class, IIDefine a method (or several methods) to be executed before each testInitialize your variables in this method, so that each test starts with a fresh set of values@Beforepublic void setUp() { program = new MyProgram(); someVariable = 1000;}You can define one or more methods to be executed after each testTypically such methods release resources, such as filesUsually there is no need to bother with this method@Afterpublic void tearDown() {}6A simple exampleSuppose you have a class Arithmetic with methods int multiply(int x, int y), and boolean isPositive(int x)import org.junit.*;import static org.junit.Assert.*; public class ArithmeticTest {}@Testpublic void testMultiply() { assertEquals(4, Arithmetic.multiply(2, 2)); assertEquals(-15, Arithmetic.multiply(3, -5));}@Testpublic void testIsPositive() { assertTrue(Arithmetic.isPositive(5)); assertFalse(Arithmetic.isPositive(-5)); assertFalse(Arithmetic.isPositive(0));}7Assert methods IWithin a test,Call the method being tested and get the actual resultAssert what the correct result should be with one of the assert methodsThese steps can be repeated as many times as necessaryAn assert method is a JUnit method that performs a test, and throws an AssertionError if the test failsJUnit catches these Errors and shows you the resultstatic void assertTrue(boolean test)static void assertTrue(String message, boolean test)Throws an AssertionErrorif the test failsThe optional message is included in the Errorstatic void assertFalse(boolean test)static void assertFalse(String message, boolean test)Throws an AssertionErrorif the test fails8Example: Counter classFor the sake of example, we will create and test a trivial “counter” classThe constructor will create a counter and set it to zeroThe increment method will add one to the counter and return the new valueThe decrement method will subtract one from the counter and return the new valueIn this simple example, the JUnit tests are more code than the class itselfThis isn’t usually the case for “real” classes and methods9JUnit tests for Counter public class CounterTest { Counter counter1; // declare a Counter here @Before void setUp() { counter1 = new Counter(); // initialize the Counter here } @Test public void testIncrement() { assertTrue(counter1.increment() == 1); assertTrue(counter1.increment() == 2); } @Test public void testDecrement() { assertTrue(counter1.decrement() == -1); }}Note that each test begins with a brand new counter This means you don’t have to worry about the order in which the tests are run10The Counter class itselfpublic class Counter {int count = 0;public int increment() { return count += 1;}public int decrement() { return count -= 1;} public int getCount() { return count; }}Is JUnit testing overkill for this little class?The Extreme Programming view is: If it isn’t tested, it doesn’t workYou are not likely to have many classes this trivial in a real program, so writing JUnit tests for those few trivial classes is no big dealOften even XP programmers don’t bother writing tests for simple getter methods such as getCount()We only used assertTrue in this example, but there are additional assert methods11Warning: equalsYou can compare primitives with ==Java has a method x.equals(y), for comparing objectsThis method works great for Strings and a few other Java classesFor objects of classes that you create, you have to define equalsassertEquals(expected, actual) uses == or equalsTo define equals for your own objects, define exactly this method:public boolean equals(Object obj) { ... }The argument must be of type Object, which isn’t what you want, so you must cast it to the correct type (say, Person):public boolean equals(Object something) { Person p = (Person)something; return this.name == p.name; // test whatever you like here}We’ll talk much more about equals later12Assert methods IIassertEquals(expected, actual)assertEquals(String message, expected, actual)expected and actual must be both objects or the same primitive typeFor objects, uses your equals method, if you have defined it properly, as described on the previous
View Full Document