Mockito 看起来像是一个非常可爱的 Java 存根/模拟框架。唯一的问题是我找不到任何关于使用他们的 API 的最佳方法的具体文档。测试中常用的方法包括:
doXXX(???) : Stubber
when(T) : OngoingStubbing
then(T) : OngoingStubbing
verify(???) : T
given(T) : BDDOngoingStubbing
willXXX(???) : BDDStubber
当您在实践中看到 Mockito 的示例时,您会看到如下代码:
when(yourMethod()).thenReturn(5);
从我读过的所有文档中,我已经确定了 Mockito“语法”的几种“模式”,这些“模式”是通过将这些方法调用以菊花链形式连接在一起而获得的,就像上面的示例一样。我发现的一些常见模式是:
当/那么:当(yourMethod()).thenReturn(5);
给予/意愿:给定(yourMethod()).willThrow(OutOfMemoryException.class);
Do/When:doReturn(7).when(yourMock.fizzBuzz());
意愿/给予/做:willReturn(any()).given(yourMethod()).doNothing();
验证/执行:验证(yourMethod()).doThrow(SomeException.class);
我所困惑的是如何选择正确的方法调用模式/组合来对我的测试用例进行建模。看起来你可以将它们以菊花链的方式连接在一起,形成看似无穷无尽的组合,但我不确定哪种模式适合哪个问题。
一些 Mockito Guru 能否帮助阐明 Mockito 方法的哪些模式/组合用于哪些类型的测试用例(以及为什么)?提前致谢!
该方法有几个缺点when/thenReturn
, when/thenThrow
and when/then
语法。例如,
- 如果是
when/thenReturn
,如果返回类型是带有
通配符,并且您希望返回相同类型的模拟,您将无法
以避免编译警告。
- 你不能使用
when/thenThrow
and when/then
对于一个 void 方法。
- 您不能在 Mockito 间谍上使用这些语法。
- 你只能打电话
when
对于模拟对象的每个组合一次,
方法和参数,除非你调用reset
在模拟上。
- Calling
when
多次模拟一种组合
当您使用参数匹配器时,对象和方法可能会导致问题。
我发现这些案例很难记住。因此,不要尝试跟踪何时when/thenReturn
, when/thenThrow
and when/then
语法会起作用,也不会起作用,我宁愿完全避免它们,而倾向于doReturn/when
, doThrow/when
and doAnswer/when
备择方案。也就是说,因为您偶尔需要doReturn/when
, doThrow/when
and doAnswer/when
,并且您始终可以使用这些方法,学习如何使用是没有意义的when/thenReturn
, when/thenThrow
and when/then
.
注意doReturn
, doThrow
and doAnswer
可以以同样的方式链接在一起thenReturn
, thenThrow
and then
。他们没有的是在一次调用中返回多个值(或抛出多个异常,或运行多个答案)的选项doReturn
, doThrow
and doAnswer
。但我发现我很少需要这样做,所以这并不重要。
还有一个缺点doReturn
,我认为微不足道。您不会像使用那样进行编译时检查其参数的类型when/thenReturn
。因此,如果参数类型错误,只有运行测试后才能发现。坦白说,我不在乎。
综上所述,我使用Mockito已经两年多了,我认为一贯的使用doReturn
, doThrow
and doAnswer
成为 Mockito 最佳实践。其他 Mockito 用户不同意。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)