Version 4 of the popular
JUnit test framework has been available for use for quite some time (In fact, it is up to version 4.5). However, many projects have a wealth of JUnit 3-style tests and developers may choose to continue using it. If, on the other hand, you decide to dip your toes in JUnit 4 waters, make it a complete immersion. Don't try to mix and match.
As you may be aware, couple of the touted "benefits" of JUnit 4 are the obviation of extending the
TestCase class and the identification of test and lifecycle methods (
setUp and
tearDown) using Java 5 annotations. For example, the following is a valid JUnit 4-style test case (minus the necessary imports):
public class BusinessLogicTests {
@Before
public void do_this_before_every_test() {
// set up logic goes here
}
@After
public void clean_up_after_a_test() {
// teardown logic goes here
}
@Test
public void addition() {
assertEquals("Invalid addition", 2, 1+1);
}
}
Observe how
- The class does not extend
TestCase
- The "setup" and "tearDown" methods are identified by annotations
- The test method does not require a "test" prefix and is also annotated
I'll let
you be the judge of whether this is an improvement on JUnit 3. What I want to alert you to are the perils of subconciously mixing JUnit-3 and JUnit-4 style programming. Consider the following test case:
public class BusinessLogicTests extends TestCase {
@Before
public void do_this_before_every_test() {
// set up logic goes here
}
@After
public void clean_up_after_a_test() {
// teardown logic goes here
}
@Test
public void testAddition() {
assertEquals("Invalid addition", 2, 1+1);
}
@Test
public void subtraction() {
assertEquals("Invalid subtraction", 1, 1-1);
}
}
This will result in a green-bar even though there is an error in the test of subtraction. Can you guess why?
It was that pesky little
extends TestCase that I added from force of habit. The flips the switch to JUnit-3, which knows nothing about annotations, ignores my setup and teardown methods and looks for methods prefixed by
test. It
completely ignores the method named subtraction!
And of course, conversely, the following is just a plain old Java class that won't be acknowledged by either JUnit-3 or JUnit-4.
public class BusinessLogicTests {
public void testAddition() {
assertEquals("Invalid addition", 2, 1+1);
}
}
Final word of advice, if you are using
Struts Test Case, you have no choice but to write JUnit-3 style tests since the parent class of the framework (
MockStrutsTestCase) extends Junit-3's
TestCase.