似乎的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);
做/当:doReturn(7)。当(yourMock.fizzBuzz());
请问/鉴于/ DO:。willReturn(任何())给出(yourMethod())doNothing();
验证/ DO:验证(yourMethod())doThrow(SomeException.class);
什么我窒息是如何选择正确的模式/组合的方法调用我的测试用例建模。 好像你可以菊花链这些一起看似无尽的连击,我不知道什么模式是正确的哪些问题。
一些大师的Mockito可以帮助提供一些线索哪个模式/用于哪些类型的测试用例(为什么)的方法的Mockito组合? 提前致谢!
通常的Mockito有做事的方法有多种。
我发现大多采用自己:
// Setup expectations
when(object.method()).thenReturn(value);
when(object.method()).thenThrow(exception);
doThrow(exception).when(object.voidMethod());
// verify things
verify(object, times(2)).method();
verify(object, times(1)).voidMethod();
我发现,我能做些什么,我需要使用这三种调用的95%。
此外,您使用的是什么版本的的Mockito? “给予”和“将”结构中不存在的最新版本(1.9.0+)
不过,也有我想要的返回值或例外,以输入响应的情况。 在这种情况下,你可以使用应答接口来检查方法参数和返回一个适当的值。
public class ReturnFirstArg<T> implements Answer<T> {
public T answer(InvocationOnMock invocation) {
return invocation.getArguments()[0];
}
}
when(object.method(7)).thenAnswer(new ReturnFirstArg<Integer>());
有一些缺点when/thenReturn
, when/thenThrow
和when/then
语法。 例如,
- 在的情况下,
when/thenReturn
,如果返回类型是一个通用的一个通配符,并且您希望返回相同类型的模拟,你将无法避免编译警告。 - 不能使用
when/thenThrow
和when/then
为无效的方法。 - 你不能在间谍的Mockito使用这些语法。
- 你只能调用
when
一次模拟对象,方法和参数的每一种组合,除非你调用reset
的模拟。 - 调用
when
多次,模仿对象和方法的一个组合,当您使用参数匹配器,可能会导致问题。
我发现这些案件难以记住。 因此,而不是试图跟踪时, when/thenReturn
, when/thenThrow
和when/then
语法都可以了,不行的,我宁愿完全避免它们,赞成的doReturn/when
, doThrow/when
和doAnswer/when
替代品。 这就是说,因为你偶尔需要doReturn/when
, doThrow/when
和doAnswer/when
,你可以随时使用这些方法,还有在学习如何使用没有点when/thenReturn
, when/thenThrow
和when/then
。
需要注意的是doReturn
, doThrow
和doAnswer
可以在同样的方式链接在一起thenReturn
, thenThrow
和then
。 他们不具备是一个调用中返回多个值(或抛出一些例外,或者运行几个答案)选项doReturn
, doThrow
和doAnswer
。 但我发现,我需要做,所以很少,这并不重要。
还有一个缺点doReturn
,我认为微不足道。 你没有得到编译的时候它的参数类型的检查,像你这样做when/thenReturn
。 所以,如果你得到的参数类型错了,你会不会发现,直到您运行测试。 坦率地说,我不在乎。
总之呢,我已经使用了的Mockito两年多了,我考虑了一贯使用的doReturn
, doThrow
和doAnswer
是一个最好的Mockito实践。 其他用户的Mockito不同意。
事实上,事情看起来比你想象的要简单得多
REF: http://static.javadoc.io/org.mockito/mockito-core/2.7.12/org/mockito/Mockito.html
验证 :
为了使用的Mockito,你需要了解的的Mockito一个基本理念:成株并验证分离。 因此,“验证/做”你提到的其实是在做“核查”的工作,而其他4“语法”是磕碰。 打桩定义如何模拟对象将在不同的情况作出反应。 核查是确保什么嘲笑被测试(SUT)如预期调用,在以前的调用系统。
当/然后,鉴于/请问 :
然后来到“当”和“给定”的家庭。 你可以简单地将其视为彼此的别名。 “由于”家庭中的Mockito 1.8.x的添加,使其看起来更加对齐BDD的做法。
的doXXX:
在正常情况下,我们主要使用when(xxx).then(...)
和given(...).will(...)
但也有一些情况下的语法是行不通的。 最明显的例子是,当存根方法的返回类型为void。 在这种情况下when(mockObj.voidMethod()).thenThrow(anException)
是不会编译。 作为一种变通方法,做一个替代语法/当创建,所以你可以写上一行作为doThrow(anException).when(mockObj.voidMethod())