Solución:
Consulte la API de Java para ver la lista.
los get(int index)
El método se declara para lanzar solo el IndexOutOfBoundException
que se extiende RuntimeException
.
Estás intentando decirle a Mockito que lance una excepción SomeException()
es decir no es válido para ser lanzado por esa llamada de método en particular.
Para aclarar más.
La interfaz de lista no proporciona una excepción marcada para ser lanzada desde el get(int index)
método y es por eso que Mockito está fallando.
Cuando creas el lista simulada, Mockito usará el definición de lista.class para crear su simulacro.
El comportamiento que está especificando con el when(list.get(0)).thenThrow(new SomeException())
no coincide con la firma del método en List API, porque get(int index)
el método no arroja SomeException()
entonces Mockito falla.
Si realmente quieres hacer esto, haz que Mockito lance un new RuntimeException()
o incluso mejor lanzar un 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 willAnswer()
método.
Por ejemplo, lo siguiente funciona (y no arroja un MockitoException
pero en realidad lanza un cheque Exception
como se requiere aquí) usando BDDMockito
:
given(someObj.someMethod(stringArg1)).willAnswer( invocation -> { throw new Exception("abc msg"); });
El equivalente para Mockito llano sería usar el doAnswer
método
Existe la solución con Kotlin:
given(myObject.myCall()).willAnswer {
throw IOException("Ooops")
}
De donde viene dado
import org.mockito.BDDMockito.given