问题
在Mockitodocumentation和javadocsit中说
建议使用带验证的ArgumentCaptor,但不要使用存根。
但我不明白ArgumentCaptor如何用于存根。有人可以解释上面的陈述,并说明ArgumentCaptor如何用于存根或提供一个链接,说明如何做到这一点?
#1 热门回答(228 赞)
假设要测试以下方法:
public boolean doSomething(SomeClass arg);
Mockito文档说你应该用这种方式而不是use captor:
when(someObject.doSomething(argumentCaptor.capture())).thenReturn(true);
assertThat(argumentCaptor.getValue(), equalTo(expected));
因为你可以在存根期间使用匹配器:
when(someObject.doSomething(eq(expected))).thenReturn(true);
但验证是另一回事。如果你的测试需要确保使用特定参数调用此方法,请使用ArgumentCaptor
,这是设计它的情况:
ArgumentCaptor<SomeClass> argumentCaptor = ArgumentCaptor.forClass(SomeClass.class);
verify(someObject).doSomething(argumentCaptor.capture());
assertThat(argumentCaptor.getValue(), equalTo(expected));
#2 热门回答(-2 赞)
它并没有说它可以用于存根,它用顽固说。
所以你可以像这样使用带有stubbing的argumentcaptor:
ArgumentCaptor<SomeOtherObject> argumentCaptor = argumentCaptor.forClass(SomeOtherObject.class);
stub(someObject.doSomething(someParameter)).toReturn(someOtherObject);
someObject.doSomething(someParameter);
verify(someObject).doSomething(argumentCaptor.capture());
虽然它可能不是一个好主意..也许是因为如果使用与someParameter不同的参数调用doSomething(),它可能会导致问题。