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!"));
答案 0 :(得分:29)
几乎没有:在简单的情况下,它们的行为完全相同。 when
语法更像是英语中的语法句子。
为什么“差不多”?请注意,when
样式实际上包含对authenticationService.login
的调用。这是在该行中评估的第一个表达式,因此在调用when
期间,无论你有什么行为都会发生。大多数情况下,这里没有问题:方法调用没有存根行为,所以Mockito只返回一个虚拟值,两个调用完全相同。但是,如果满足以下任一条件,则情况可能并非如此:
在这些情况下,doThrow
会调用when(authenticationService)
并停用所有危险行为,而when().thenThrow()
会调用危险方法并放弃测试。
(当然,对于void方法,你还需要使用doThrow
- 如果没有返回值,when
语法将无法编译。那里别无选择。)
因此,doThrow
通常会更安全一些,但when().thenThrow()
稍微更具可读性,通常是等效的。