JUnit4 introduced @Test annotations and removes the need to prefix test method names with ‘test’. Take advantage of this and use a different test case naming convention to test the class behaviour, not it's implementation
Compare the two units test below and see which one is easier to read.
Think about diagnosing a test failure and also how quickly you can understand the what the code does.
public class ShoppingCartTest { private ShoppingCart cart = null; @Before public void init() { cart = new ShoppingCart(); cart.addItem( new ShoppingCart.Item( "Chocolate bar", 52 ) ); } @Test public void testProcessPayment() { assertTrue( cart.processPayment( new CashPayment() ) ); assertTrue( cart.processPayment( new VoucherPayment( "123" ) ) ); assertFalse( cart.processPayment( new VoucherPayment( null ) ) ); assertFalse( cart.processPayment( new VoucherPayment( "" ) ) ); } }
This test suite tests the expected behaviour and uses descriptive test names. Each test sticks to a single concept. This is also a great example of Unit Tests as documentation, each test case tells a story of what the code does.
public class ShoppingCartTest { private ShoppingCart cart = null; @Before public void init() { cart = new ShoppingCart(); cart.addItem( new ShoppingCart.Item( "Chocolate bar", 52 ) ); } @Test public void shouldProcessCashPayment() { assertTrue( cart.processPayment( new CashPayment() ) ); } @Test public void shouldProcessVoucherPayment() { assertTrue( cart.processPayment( new VoucherPayment( "123" ) ) ); } @Test public void shouldNotProcessVoucherPaymentForInvalidVoucherReference() { assertFalse( cart.processPayment( new VoucherPayment( null ) ) ); assertFalse( cart.processPayment( new VoucherPayment( "" ) ) ); } }
Quality is never an accident; it is always the result of intelligent effort
John Ruskin http://softwaretestingfundamentals.com/software-testing-quotes/