Lecture Notes on JUnit (COMP 303)

JUnit is a simple framework for testing Java programs

Example Problem: Representing a currency

class Money {
    private int fAmount;
    private String fCurrency;

    public Money(int amount, String currency) {
        fAmount= amount;
        fCurrency= currency;
    }

    public int amount() {
        return fAmount;
    }

    public String currency() {
        return fCurrency;
    }

    public Money add(Money m) {
      return new Money(amount()+m.amount(), currency());
    }
}

Want to test the add method - code a little - test a little

Let's see what it looks like:

public class MoneyTest extends TestCase {

    public void testSimpleAdd() {
        Money m12CHF= new Money(12, "CHF");  // (1)
        Money m14CHF= new Money(14, "CHF");        
        Money expected= new Money(26, "CHF");
        Money result= m12CHF.add(m14CHF);    // (2)
        Assert.assertTrue(expected.equals(result));     // (3)
    }
}

But wait, how do we check if two Money objects are equal?

Now we have the test, let's implement the code

public class Money { 
  // ... all the previous code 
  public boolean equals(Object anObject) {
    if (anObject instanceof Money) {
        Money aMoney= (Money)anObject;
        return aMoney.currency().equals(currency())
            & & amount() == aMoney.amount();
    }
    return false;
}

Maybe add another case?

public void testEquals() {
    Money m12CHF= new Money(12, "CHF");
    Money m14CHF= new Money(14, "CHF");
    Object o = new Object();  // new fixture here

    Assert.assertTrue(!m12CHF.equals(null));
    Assert.assertEquals(m12CHF, m12CHF);
    Assert.assertEquals(m12CHF, new Money(12, "CHF"));
    Assert.assertTrue(!m12CHF.equals(m14CHF));
    Assert.assertTrue(!m12CHF.equals(o)); // new test case here
}

Avoiding code duplication between different tests

public class MoneyTest extends TestCase {
    private Money f12CHF;
    private Money f14CHF;   

    protected void setUp() {
        f12CHF= new Money(12, "CHF");
        f14CHF= new Money(14, "CHF");
    }

    public void testEquals() {
      Assert.assertTrue(!f12CHF.equals(null));
      Assert.assertEquals(f12CHF, f12CHF);
      Assert.assertEquals(f12CHF, new Money(12, "CHF"));
      Assert.assertTrue(!f12CHF.equals(f14CHF));
    }

    public void testSimpleAdd() {
      Money expected= new Money(26, "CHF");
      Money result= f12CHF.add(f14CHF);
      Assert.assertTrue(expected.equals(result));
    }
}

Putting test cases into a suite of tests

Define a static method called suite() as follows:

Ok, now let's run the test suite.

Some general testing practices