jeter checked Exceptions se moque avec Mockito
J'essaie d'avoir un de mes moqué des objets de jeter un checked Exception lorsqu'une méthode est appelée. Je suis en train suivantes.
@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 {
}
Cependant, que 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
À la recherche à la Mockito documentation, ils n'utilisent que RuntimeException
, n'est-il pas possible de jeter checked Exceptions à partir d'un objet fantaisie avec Mockito?
Vous devez vous connecter pour publier un commentaire.
Vérifier l'API Java pour Liste. Le get(int) de la méthode est déclarée à lancer uniquement la IndexOutOfBoundException qui extends RuntimeException. Vous êtes en train de dire Mockito à un lever une exception qui n'est pas valide pour être jeté par appel de méthode.
À préciser davantage. La Liste de l'interface n'est pas cochée Exception de la méthode get() et c'est pourquoi Mockito est un échec. Lorsque vous créez des mocks Liste, Mockito à l'aide de la définition de List.class pour crée sa fantaisie. 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 le faire, alors Mockito jeter unnew RuntimeException()
ou même mieux de se débarrasser d'unnew ArrayIndexOutOfBoundsException()
depuis l'API précise que c'est la seule Exception.Throws
annotation de faire le compilateur de générer le même bytecode à la déclaration jette l'équivalent de code Java. Voir [ici] (kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-throws/...) pour plus de détails.Une solution de contournement consiste à utiliser un
willAnswer()
méthode.Par exemple, les travaux suivants (et ne jette pas un
MockitoException
mais en fait, jette un activéeException
comme ici) à l'aide deBDDMockito
:L'équivalent de la plaine Mockito serait d'utiliser le
doAnswer
méthodewillAnswer( invocation -> { throw new Exception("abc msg"); }).given(someObj).someMethod(stringArg1);
lorsque la méthode retournevoid
.