Mockito:thenThrow(Exception.class)和thenThrow(new Exception())的区别

3
我第一次使用Mockito,我想知道使用when(dao.create(order))。thenThrow(new SQLException())when(dao.create(order))。thenThrow(SQLException.class)的区别。这两种看起来都可以正常运行,但我在Mockito API中找不到任何相关信息。

我唯一能想到的区别是,当使用new SQLException()时,您可以在构造函数中输入参数。就是这样吗?

2个回答

2
when(dao.create(order)).thenThrow(new SQLException()); 

这将抛出您提供的异常对象。例如,您可以创建一个具有特定参数的异常,例如new SQLException("异常描述", "sql:code")

when(dao.create(order)).thenThrow(SQLException.class); 

这将使用反射创建指定类的默认实例。

那么,为什么SQLException.class存在?它与没有参数的new SQLException()是一样的东西。还是有特定的原因吗? - J. Kamans
这是一个调用的快捷方式。因此,thenThrow(SQLException.class)和thenTrhow(new SQLException())具有相同的意义。第一种情况始终期望指定异常类的默认构造函数(无参数构造函数)。 - Martin Strejc
@MartinStrejc 好的,所以这只是一个快捷方式。明白了。 - J. Kamans

0

thenThrow 可以将 throwable 作为其参数。您不应该监视 throwable,因为这意味着逻辑也可以捕获通常无法恢复的错误。

传递 new SQLException() 等同于 SQLException.class


感谢您提供 GitHub 的链接。如果我理解您的回答,我不应该使用 thenThrow(Throwable.class),因为它也会捕获 Error(Throwable 的子类)。好的,我注意到了!但是我不知道什么情况下我会想要这样做,我只测试异常。 - J. Kamans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接