gpt4 book ai didi

junit - 为什么 Mock 对象有 doreturn 然后为 mock 返回?

转载 作者:行者123 更新时间:2023-12-05 00:16:48 27 4
gpt4 key购买 nike

注意:我知道在 spy 中我们可以区分这两者。
我浏览了整个互联网,但我仍然对 Mockito 中的 doreturn/何时和何时/然后返回有些疑问。以下是我的疑问,

1) doreturn/when 和 when/thenreturn 对于模拟对象的行为是否相同?
即:对于模拟对象调用 doreturn/when 或 when/thenreturn 并不重要,它不会调用真正的方法,而是调用 stub 调用。
我的理解是否正确?

2)doreturn/when 和 when/thenreturn 仅对 Mockito 中的 spy 对象有影响。
即 doreturn/when - 不会调用真正的方法,而 when/thenreturn 将调用真正的方法。我对此的理解是否正确?

如果我对以上 2 点的理解是正确的,那么我们应该始终使用 doreturn/when 以便我们不需要学习 2 语法,对吗?

最佳答案

Mockito documentationdoReturn()状态:

You can use doThrow(), doAnswer(), doNothing(), doReturn() and doCallRealMethod() in place of the corresponding call with when(), for any method. It is necessary when you

  • stub void methods
  • stub methods on spy objects (see below)
  • stub the same method more than once, to change the behaviour of a mock in the middle of a test.


并且...

Use doReturn() in those rare occasions when you cannot use when(Object).



举个例子...

when(mock.foo()).thenThrow(new RuntimeException());

//Impossible: the exception-stubbed foo() method is called so RuntimeException is thrown. when(mock.foo()).thenReturn("bar");

//You have to use doReturn() for stubbing:
doReturn("bar").when(mock).foo();



通常,您应该使用 when(...).thenReturn(...) doReturn(...).when(...) 的语法和场合语法有用的很少。但是,重要的是要注意 when(...)模拟 void 方法需要模式,这并不罕见。这只是 doReturn(...)不太常用的语法。

具体回答您的问题:
  • 不,这两种语法的工作方式略有不同 - 'doReturn(...)' 能够设置模拟对象以在调用模拟方法之前记录行为,而 'when(...)' 语法的工作原理是做一些幕后的 jiggery-pokery 来设置一个 'thenReturn(...)' 方法可以处理的 stub 处理程序。它们通常具有相同的效果,但在上述极端情况下,实现差异变得明显。
  • 对于模拟,when(...)在模拟对象上调用 stub 方法。这就是为什么上面关于重新定义 stub 行为的极端情况很重要的原因。
  • 关于junit - 为什么 Mock 对象有 doreturn 然后为 mock 返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41378300/

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