Reputation: 10469
Testing a snip:
void somefunction() {
try {
aMock.doSomething();
bMock.another();
} finally {
cMock.cleanup();
}
}
Test:
@Test(expected = Exception.class)
void sometest() {
... setup various mocks ...
PowerMockito.doThrow(new Exception("abc")).when(aMock).doSomething();
outerMock.somefunction();
// ** THIS SHOULD FAIL
verify(bMock).another();
// ** THIS SHOULD FAIL TOO
verify(cMock, never()).cleanup()
}
When I run this it passes. Why? Does the throw Exception (and handling in @Test) trump the verify statements?
If so - is there some way to test that the finally clause was executed?
Upvotes: 2
Views: 5563
Reputation:
Because the exception is thrown (for real), everything under your function code is dead code.
outerMock.somefunction(); // throw so, this is the end
// ------- dead code blow:
// ** THIS SHOULD FAIL
verify(bMock).another();
// ** THIS SHOULD FAIL TOO
verify(cMock, never()).cleanup()
So to test the finally block you have to use a normal execution (when no exception occurs). Another solution would be to use a try/catch in the test:
try {
outerMock.somefunction();
fail("was expecting an exception..");
} catch(Exception exception) {
// ignore
}
verify(bMock).another();
verify(cMock, never()).cleanup()
To answer to the question in comments:
assuming the code is now:
void somefunction() {
try {
aMock.doSomething();
bMock.another();
} catch(Exception ex) {
cMock.handleException(ex);
}
}
the test could be:
Exception testEx = new Exception("testing")
Mockito.when(aMock.doSomething()).thenThrow(testEx);
instance.somefunction();
Mockito.verify(cMock).handleException(testEx);
Upvotes: 2