抛出检查exception与Mockito嘲笑
我试图让我的一个模拟对象抛出一个检查exception,当一个特定的方法被调用。 我正在尝试以下。
@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 { }
但是,这会产生以下错误。
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
看看Mockito文档 ,他们只使用RuntimeException
,是不是可能从Mockito的模拟对象抛出检查exception?
检查Java API的列表 。 get(int)方法被声明为只抛出延伸RuntimeException的IndexOutOfBoundException。 你正试图告诉Mockito抛出一个无效的exception,该exception被这个特定的方法调用抛出。
进一步澄清。 List接口不提供从get()方法抛出的checkedexception,这就是为什么Mockito失败。 当你创build模拟List时,Mockito使用List.class的定义来创build它的模拟。 你使用when(list.get(0)).thenThrow(new SomeException())
指定的行为与when(list.get(0)).thenThrow(new SomeException())
中的方法签名不匹配,所以Mockito失败。 如果你真的想要这样做,那么Mockito会抛出一个new RunTimeException()
RunTimeException new RunTimeException()
,甚至更好地抛出一个new ArrayIndexOutOfBoundsException()
因为API指定这是唯一有效的抛出exception。