如何使用ArgumentCaptor进行存根?

问题

在Mockitodocumentationjavadocsit中说

建议使用带验证的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(),它可能会导致问题。