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( );
...
}
|