gpt4 book ai didi

java - 形成 Mockito "grammars"

转载 作者:IT老高 更新时间:2023-10-28 20:48:09 26 4
gpt4 key购买 nike

Mockito 似乎是一个非常漂亮的 Java stub /模拟框架。唯一的问题是我找不到任何关于使用他们的 API 的最佳方式的具体文档。测试中常用的方法包括:

doXXX(???) : Stubber
when(T) : OngoingStubbing
then(T) : OngoingStubbing
verify(???) : T
given(T) : BDDOngoingStubbing
willXXX(???) : BDDStubber

当您在实践中看到 Mockito 示例时,您会看到如下代码:

when(yourMethod()).thenReturn(5);

从我读过的所有文档中,我已经确定了 Mockito “语法”的几个“模式”,这些模式是通过将这些方法调用以菊花链方式连接在一起的,就像上面的示例一样。我发现的一些常见模式是:

When/Then: when(yourMethod()).thenReturn(5);

Given/Will: given(yourMethod()).willThrow(OutOfMemoryException.class);

Do/When: doReturn(7).when(yourMock.fizzBuzz());

Will/Given/Do: willReturn(any()).given(yourMethod()).doNothing();

Verify/Do: verify(yourMethod()).doThrow(SomeException.class);

我感到窒息的是如何选择正确的方法调用模式/组合来为我的测试用例建模。似乎您可以将它们以看似无穷无尽的组合菊花链式连接在一起,但我不确定哪种模式适合哪个问题。

Mockito 大师能否帮助阐明 Mockito 方法的哪些模式/组合用于哪些类型的测试用例(以及为什么)?提前致谢!

最佳答案

when/thenReturnwhen/thenThrowwhen/then 语法有几个缺点。例如,

  • when/thenReturn 的情况下,如果返回类型是带有 a 的泛型通配符,并且您希望返回相同类型的模拟,您将无法以避免编译警告。
  • 您不能将 when/thenThrowwhen/then 用于 void 方法。
  • 您不能在 Mockito spy 上使用这些语法。
  • 模拟对象的每个组合只能调用一次when,方法和参数,除非您在模拟上调用 reset
  • 为一种模拟组合多次调用 when对象和方法,当您使用参数匹配器时,可能会导致问题。

我发现这些案例很难记住。因此,与其尝试跟踪何时when/thenReturnwhen/thenThrowwhen/then 语法会和不会起作用,我更愿意完全避免使用它们,而赞成doReturn/whendoThrow/whendoAnswer/when 备选方案。也就是说,由于您偶尔会需要 doReturn/whendoThrow/whendoAnswer/when,因此您可以始终使用这些方法,学习如何使用 when/thenReturnwhen/thenThrowwhen/then 毫无意义。

注意 doReturndoThrowdoAnswer 可以像 thenReturn 一样链接在一起,thenThrowthen。他们没有的是在对 doReturndoThrow 的一次调用中返回多个值(或抛出多个异常,或运行多个答案)的选项回答。但我发现我很少需要这样做,这并不重要。

doReturn 还有一个缺点,我认为这无关紧要。您不会像使用 when/thenReturn 那样在编译时检查其参数的类型。所以如果你弄错了参数类型,在你运行测试之前你不会发现。坦白说,我不在乎。

那么总结一下,我用Mockito已经两年多了,我考虑一致使用doReturndoThrowdoAnswer 成为 Mockito 最佳实践。其他 Mockito 用户不同意。

关于java - 形成 Mockito "grammars",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11462697/

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