Use a try
/catch
block to catch
the expected exception. Call the fail( )
method if
the exception does not occur.
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( ); ... }
Get Java Extreme Programming Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.