I’m trying to have one of my mocked objects throw a checked Exception when a particular method is called. I’m trying the following.
@Test(expectedExceptions = SomeException.class)
public void throwCheckedException() {
List<String> list = mock(List.class);
when(list.get(0)).thenThrow(new SomeException());
String test = list.get(0);
}
public class SomeException extends Exception {
}
However, that produces the following error.
org.testng.TestException:
Expected exception com.testing.MockitoCheckedExceptions$SomeException but got org.mockito.exceptions.base.MockitoException:
Checked exception is invalid for this method!
Invalid: com.testing.MockitoCheckedExceptions$SomeException
Looking at the Mockito documentation, they only use RuntimeException, is it not possible to throw checked Exceptions from a mock object with Mockito?
Check the Java API for List.
The
get(int index)method is declared to throw only theIndexOutOfBoundExceptionwhich extendsRuntimeException.You are trying to tell Mockito to throw an exception
SomeException()that is not valid to be thrown by that particular method call.To clarify further.
The List interface does not provide for a checked Exception to be thrown from the
get(int index)method and that is why Mockito is failing.When you create the mocked List, Mockito will use the definition of List.class to creates its mock.
The behavior you are specifying with the
when(list.get(0)).thenThrow(new SomeException())doesn’t match the method signature in List API, becauseget(int index)method does not throwSomeException()so Mockito fails.If you really want to do this, then have Mockito throw a
new RuntimeException()or even better throw anew ArrayIndexOutOfBoundsException()since the API specifies that that is the only valid Exception to be thrown.