如何使用 Mockito 抛出 SQLServerException或 SQLException?

问题描述

我无法创建 sqlServerException 的实例,因为构造函数都是内部的。使用 sqlException 时出现以下错误

org.mockito.exceptions.base.MockitoException:检查异常是 此方法无效!

方法签名(在 sqlServerPreparedStatement 上): public boolean execute() throws sqlServerException,sqlTimeoutException

和... public final class sqlServerException extends sqlException

模拟:

val fakeCmd : sqlServerPreparedStatement = mock()
...
whenever(fakeCmd.execute()).thenThrow(sqlException()) // this line fails

我做错了什么?难道我不能抛出基本/超级异常吗?

重新建议的问题: 建议的问题与我要问的问题大不相同,另一个问题中的操作试图抛出 SomeException,这不是由 List.get 抛出的,也不是在继承树中

如果您看到上面的“方法签名(在 sqlServerPreparedStatement 上)”,则该方法抛出 sqlServerException => public final class sqlServerException extends sqlException

但它不喜欢whenever(fakeCmd.execute()).thenThrow(sqlException())

此外,所指出的公认答案是抛出 RuntimeException 因为 indexoutofboundsexception extends RuntimeException

在这种情况下,sqlServerException extends sqlException也是如此

解决方法

我评论了另一个问题,最后有一个答案(不是公认的)可能适合您的情况。


一种解决方法是使用 willAnswer() 方法。

例如,以下使用 BDDMockito 工作(并且不会抛出 MockitoException 但实际上根据此处的要求抛出已检查的异常):

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

普通 Mockito 的等价物将使用 doAnswer 方法


这是该答案的直接链接:https://stackoverflow.com/a/48261005/13210306