[ Team LiB ] Previous Section Next Section

4.13 Exception Handling

4.13.1 Problem

You want to test for exceptions.

4.13.2 Solution

Use a try/catch block to catch the expected exception. Call the fail( ) method if the exception does not occur.

4.13.3 Discussion

In the following example, the Person constructor should throw an IllegalArgumentException if both of its arguments are null. The test fails if it does not throw this exception.

public void testPassNullsToConstructor(  ) {
    try {
        Person p = new Person(null, null);
        fail("Expected IllegalArgumentException when both args are null");
    } catch (IllegalArgumentException expected) {
        // ignore this because it means the test passed!
    }
}

Only use this technique when you are expecting an exception. For other error conditions, let the exception propagate to JUnit. It will catch the exception and report a test error. Here is something you do not want to do:

// don't do this!
public void testBadStyle(  ) {
    try {
        SomeClass c = new SomeClass(  );
        c.doSomething(  );
        ...
    } catch (IOException ioe) {
        fail("Caught an IOException");
    } catch (NullPointerException npe) {
        fail("Caught a NullPointerException");
    }
}

The main problem is that JUnit already catches unhandled errors, so you are doing unnecessary work. The extra try/catch code adds complexity to your tests, making them harder to maintain. The previous example is much simpler when written like this:

// must declare IOException because it is not a RuntimeException
public void testGoodStyle(  ) throws IOException {
    SomeClass c = new SomeClass(  );
    c.doSomething(  );
    ...
}
    [ Team LiB ] Previous Section Next Section