unitarias unitaria unit una tutorial test que pruebas prueba hacer expected ejemplos como java mocking mockito

java - unitaria - tirar excepciones marcadas de simulacros con Mockito



testing en java (2)

Estoy intentando que uno de mis objetos burlados arroje una Excepción marcada cuando se llama a un método en particular. Estoy intentando lo siguiente.

@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 { }

Sin embargo, eso produce el siguiente 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

Al mirar la documentación de Mockito , solo usan RuntimeException , ¿no es posible arrojar excepciones comprobadas de un objeto simulado con Mockito?


Compruebe la API de Java para la List . El método get (int) se declara para arrojar solo IndexOutOfBoundException que extiende RuntimeException. Está tratando de decirle a Mockito que haga una excepción que no es válida para ser lanzada por esa llamada a un método en particular.

Para aclarar más. La interfaz de la Lista no proporciona una Excepción marcada que se lanzará desde el método get () y es por eso que Mockito está fallando. Cuando creas la Lista burlada, Mockito usa la definición de List.class para crear su simulación. El comportamiento que está especificando con when(list.get(0)).thenThrow(new SomeException()) no coincide con la firma del método en List.class, por lo que Mockito falla. Si realmente quieres hacer esto, entonces haz que Mockito lance una new RunTimeException() o incluso mejor que lance una new ArrayIndexOutOfBoundsException() ya que la API especifica que esa es la única Excepción válida que se lanzará.


Una solución alternativa es utilizar un método willAnswer() .

Por ejemplo, los siguientes trabajos (y no arroja una MockitoException sino que arroja una Exception marcada como se requiere aquí) utilizando BDDMockito :

given(someObj.someMethod(stringArg1)).willAnswer( invocation -> { throw new Exception("abc msg"); });

El equivalente de Mockito simple usaría el método doAnswer