2010-09-21 18 views
75

Estoy intentando que uno de mis objetos simulados arroje una Excepción marcada cuando se llama a un método en particular. Estoy intentando lo siguiente.throw checked Excepciones de simulacros con Mockito

@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 

Mirando el Mockito documentation, que sólo utilizan RuntimeException, no es posible lanzar excepciones controladas desde un objeto de burla con Mockito?

Respuesta

115

Compruebe la API de Java para 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 el 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 arroje un new RunTimeException() o incluso mejor que arroje un new ArrayIndexOutOfBoundsException() ya que la API especifica que esa es la única Excepción válida que se lanzará.

+0

Si bien mi código real en realidad no usaba Lista, su respuesta se aplica también a esa llamada de método. Me burlaba del método equivocado. Gracias. –

+2

extra: Mocktio no se quejará si lo hace. Tire un método sin elementos descartables, pero también obtendrá esta excepción – dwana

+1

Para Kotliners: Kotlin no ha marcado excepciones, por lo que normalmente no puede declarar (en la función) que la función arroja una excepción. Sin embargo, puede anotar la función con la anotación 'Throws' para hacer que el compilador genere el mismo bytecode que declara throws en el código Java equivalente. Ver [aquí] (https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-throws/index.html) para más detalles. – Metallica

2

Una solución consiste en utilizar un método willAnswer().

Por ejemplo las siguientes obras (y no lanza un MockitoException pero en realidad arroja una marcada Exception como se requiere aquí) usando BDDMockito:

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

El equivalente de llanura Mockito sería utilizar el método doAnswer

Cuestiones relacionadas