Mockito:doThrow()和thenThrow()之间的区别

Man*_*tha 19 mockito

doThrow()和之间有什么区别thenThrow()

假设我们想要模拟身份验证服务来验证用户的登录凭据.如果我们要模拟异常,以下两行之间的区别是什么?

doThrow(new BadCredentialsException("Wrong username/password!")).when(authenticationService).login("user1", "pass1");
Run Code Online (Sandbox Code Playgroud)

VS

when(authenticationService.login("user1", "pass1")).thenThrow(new BadCredentialsException("Wrong username/password!"));
Run Code Online (Sandbox Code Playgroud)

Jef*_*ica 36

几乎没有:在简单的情况下,它们的行为完全相同.该when语法读起来更像是在英语语法的句子.

为什么"差不多"?请注意,该when样式实际上包含一个调用authenticationService.login.这是在该行中评估的第一个表达式,因此无论您在调用期间发生什么行为都会发生when.大多数情况下,这里没有问题:方法调用没有存根行为,所以Mockito只返回一个虚拟值,两个调用完全相同.但是,如果满足以下任一条件,则可能不是这种情况:

  • 你已经覆盖了已经存根的行为,特别是运行一个答案或抛出异常
  • 你正在与一个具有非平凡实现的间谍一起工作

在这些情况下,doThrow将调用when(authenticationService)和停用所有危险行为,而when().thenThrow()将调用危险方法并放弃测试.

(当然,对于void方法,你还需要使用doThrow- when如果没有返回值,语法将无法编译.那里别无选择.)

因此,doThrow作为一项规则总是更安全一些,但when().thenThrow()稍微更具可读性,通常是等效的.

  • 我认为`doThrow(...)。when(...)`的主要原因是不返回值的方法 (4认同)
  • @BretC 是的,doVerb 适用于存根 void 方法,但这没有什么微妙之处;`when` 根本无法编译。因为我看到了很多相关的问题,所以我专注于更细微的差异。还是谢谢大家——我会编辑的。 (2认同)