抛出检查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。