Let's say you are unit testing, using EasyMock to verify the behaviour of your code under test and now you want to test that your method throws a particular exception:
We expect that the
The way around this is to use an elegant
Technorati Tags: Unit Testing, Java, Exception, Mock Object, EasyMock, Andrew Beacock
@Test(expected = SQLException.class)As you can see this is another test from my previous EasyMock post on how to use EasyMock's expect method when unit testing. We are now testing that when we call the
public void parseThrowsException() throws SQLException {
ResultSet mockResultSet = createMock(ResultSet.class);
expect(mockResultSet.next()).andThrow(new SQLException());
mockResultSet.close();
replay(mockResultSet);
ResultReporter reporter = new ResultReporter();
reporter.parse(mockResultSet);
verify(mockResultSet);
}
next method it throws an SQLException (to simulate the database going down).We expect that the
next method call will throw an exception and then we are expecting that close will be called. If you run this test then you will find that it passes with green flying colours - but there's a problem, this is the implementation of the parse method:public boolean parse(ResultSet results) throws SQLException {
return results.next();
}As you can see it never calls the close method of the passed in ResultSet - so the test should have failed. It passes because the test has exited before it gets to verify the mock ResultSet for expected behaviour.The way around this is to use an elegant
try/finally block around the code under test like this:try {
ResultReporter reporter = new ResultReporter();
reporter.parse(mockResultSet);
} finally {
verify(mockResultSet);
}If you make this change to the above test then it fails as expected, now I just need to fixed the code... So you now know how to test for thrown exceptions and ensure that your mock objects are verified as well!Technorati Tags: Unit Testing, Java, Exception, Mock Object, EasyMock, Andrew Beacock
Comments