Throw checked Exceptions from mocks with Mockito

1.3K    Asked by artiTrivedi in Java , Asked on Jun 9, 2021

I'm trying to have one of my mocked objects throw a checked exception is invalid for this method is called

@Test(expectedExceptions = SomeException.class)
public void throwCheckedException() {
    List list = mock(List.class);
    when(list.get(0)).thenThrow(new SomeException());
    String test = list.get(0);
}
public class SomeException extends Exception {

} 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 Runtime Exception, is it not possible to throw checked Exceptions from a mock object with Mockito?


Answered by Carl Paige

Check the Java API for List. The get(int) method is declared to throw only the IndexOutOfBoundException which extends RuntimeException. You are trying to tell Mockito to throw an exception that is not valid for this method 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() method and that is why Mockito is failing. When you create the mocked List, Mockito uses the definition of List.class to create its mock. The behavior you are specifying with the when(list.get(0)).thenThrow(new SomeException()) doesn't match the method signature in List.class, so Mockito fails. If you really want to do this, then have Mockito throw a new RuntimeException() or even better throw a new ArrayIndexOutOfBoundsException() since the API specifies that that is the only valid Exception to be thrown.



Your Answer

Interviews

Parent Categories