Exception Handling
Problem
You want to test for exceptions.
Solution
Use a try/catch block to catch
the expected exception. Call the fail( ) method if
the exception does not occur.
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( );
...
}Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access