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

时间:2016-03-31 20:29:26

标签: mockito

doThrow()thenThrow()之间的区别是什么?

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

doThrow(new BadCredentialsException("Wrong username/password!")).when(authenticationService).login("user1", "pass1");

VS

when(authenticationService.login("user1", "pass1")).thenThrow(new BadCredentialsException("Wrong username/password!"));

1 个答案:

答案 0 :(得分:29)

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

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

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

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

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

因此,doThrow通常会更安全一些,但when().thenThrow()稍微更具可读性,通常是等效的。