lanciare le eccezioni controllate da mock con Mockito

Sto cercando di far sì che uno dei miei oggetti derisi lanci un’eccezione controllata quando viene chiamato un metodo particolare. Sto provando il seguente.

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

Tuttavia, ciò produce il seguente errore.

 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 

Guardando la documentazione di Mockito , usano solo RuntimeException , non è ansible lanciare le eccezioni controllate da un object fittizio con Mockito?

Controlla l’API Java per Elenco . Il metodo get (int) viene dichiarato per generare solo IndexOutOfBoundException che estende RuntimeException. Stai cercando di dire a Mockito di lanciare un’eccezione che non è valida per essere lanciata da quella particolare chiamata di metodo.

Per chiarire ulteriormente. L’interfaccia Elenco non prevede il lancio di un’eccezione verificata dal metodo get () ed è per questo motivo che Mockito non funziona. Quando crei l’Elenco deriso, Mockito usa la definizione di List.class per creare il suo mock. Il comportamento che si sta specificando con when(list.get(0)).thenThrow(new SomeException()) non corrisponde alla firma del metodo in List.class, quindi Mockito non riesce. Se vuoi davvero farlo, allora Mockito lancia un new RunTimeException() o ancora meglio lancia un new ArrayIndexOutOfBoundsException() poiché l’API specifica che è l’unica eccezione valida a essere lanciata.

Una soluzione alternativa consiste nell’utilizzare un metodo willAnswer() .

Ad esempio il seguente funziona (e non lancia un MockitoException ma in realtà lancia MockitoException selezionata come richiesto qui) usando BDDMockito :

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

L’equivalente per Mockito normale avrebbe usato il metodo doAnswer