什么时候模拟异常 Class 有意义?

When Does It Make Sense to Mock an Exception Class?

我注意到,当您将 Spring Boot 升级到至少 2.5.11 时,似乎您模拟的任何异常,例如

@Mock
private MissingServletRequestParameterException missingServletRequestParameterException;

然后尝试按以下方式实际使用模拟

when(missingServletRequestParameterException.getParameterName()).thenReturn("Name");
when(missingServletRequestParameterException.getParameterType()).thenReturn("Type");
logger.error("An error has occurred: ", missingServletRequestParameterException);

将抛出 NullPointerException。上面的同一段代码适用于 Spring Boot 2.5.10.

但是,考虑到您可以只创建一个 Exception 对象这一事实,您似乎根本不需要模拟 Exception 类。但也许在某些情况下您需要这样做?

我不是使用模拟框架的专家,所以填补这个知识空白会很好。

模拟 class 的目的是让您可以删除 class 具有的任何逻辑,并用您自己的逻辑替换它,或者完全删除它。因此,您应该只模拟具有某种逻辑的 classes。模拟一个只有一堆字段、getter 和 setter 的 class 是浪费时间。

现在,如果您的异常 class 有逻辑,那么它所做的比异常 class 应该做的更多。你违反了单一职责原则。不要那样做。

简而言之,您永远不应该嘲笑您的异常 classes。如果您认为有必要,那么这肯定表明您做错了什么。