jetez les Exceptions vérifiées de Mockito

J’essaie d’avoir un de mes objects simulés pour lancer une exception vérifiée lorsqu’une méthode particulière est appelée. J’essaie ce qui suit.

@Test(expectedExceptions = SomeException.class) public void throwCheckedException() { List list = mock(List.class); when(list.get(0)).thenThrow(new SomeException()); Ssortingng test = list.get(0); } public class SomeException extends Exception { } 

Toutefois, cela génère l’erreur suivante.

 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 

En regardant la documentation Mockito , ils utilisent uniquement RuntimeException , n’est-il pas possible de lancer des exceptions vérifiées à partir d’un object simulé avec Mockito?

Vérifiez l’API Java pour la liste . La méthode get (int) est déclarée pour ne lancer que l’exception IndexOutOfBoundException qui étend RuntimeException. Vous essayez de dire à Mockito de lancer une exception qui n’est pas valide pour être lancée par cet appel de méthode particulier.

Pour clarifier davantage. L’interface List ne permet pas d’exécuter une exception vérifiée à partir de la méthode get () et c’est pourquoi Mockito échoue. Lorsque vous créez la liste simulée, Mockito utilise la définition de List.class pour créer sa maquette. Le comportement que vous spécifiez avec le when(list.get(0)).thenThrow(new SomeException()) ne correspond pas à la signature de la méthode dans List.class, donc Mockito échoue. Si vous voulez vraiment faire cela, demandez à Mockito de lancer une new RunTimeException() ou même de lancer une new ArrayIndexOutOfBoundsException() car l’API spécifie que c’est la seule exception valide à émettre.

Une solution consiste à utiliser une méthode willAnswer() .

Par exemple, ce qui suit fonctionne (et ne lance pas une MockitoException mais lance une Exception vérifiée comme requirejs ici) en utilisant BDDMockito :

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

L’équivalent pour plain Mockito serait d’utiliser la méthode doAnswer