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