gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:56:14 25 4
gpt4 key购买 nike

doThrow()thenThrow() 有什么区别?

比方说,我们想要模拟身份验证服务来验证用户的登录凭据。如果我们要模拟异常,下面两行有什么区别?

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

对比

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

最佳答案

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

为什么是“几乎”?请注意,when 样式实际上包含对 authenticationService.login 的调用。这是该行中计算的第一个表达式,因此您 stub 的任何行为都将在调用 when 期间发生。大多数时候,这里没有问题:方法调用没有 stub 行为,因此 Mockito 仅返回一个虚拟值,并且两个调用完全相同。但是,如果满足以下任一条件,则情况可能并非如此:

  • 您正在覆盖已经 stub 的行为,特别是运行答案或引发异常
  • 您正在与一名 spy 合作,实现一项不平凡的实现

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

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

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

关于Mockito:doThrow() 和 thenThrow() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36343149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com