如何使用ArgumentCaptor进行存根?

在Mockito 文档和javadocs中说

build议使用ArgumentCaptor进行validation,但不要使用stubbing。

但是我不明白ArgumentCaptor如何用于存根。 有人能解释一下上面的陈述,并说明如何使用ArgumentCaptor进行存根或提供一个链接来显示如何完成?

假设你有以下方法:

public boolean doSomething(SomeClass arg); 

Mockito文档说,你不应该用这种方式使用捕获器:

 ArgumentCaptor<SomeClass> argumentCaptor = ArgumentCaptor.forClass(SomeClass.class); when(someObject.doSomething(argumentCaptor.capture())).thenReturn(true); // invoke SUT (System Under Test) SomeClass expected = // some expected value assertThat(argumentCaptor.getValue(), equalTo(expected)); 

原因很简单 – 您可以在存根时使用匹配器:

 SomeClass expected = // some expected value when(someObject.doSomething(eq(expected))).thenReturn(true); // invoke SUT 

但validation可能是不同的故事。 比方说,你不需要存根doSomething 。 您对模拟的默认返回值非常满意(这将是false )。 所以你不需要存根。 但是你的testing需要确保这个方法被调用,它的论点是正确的。 然后你使用ArgumentCaptor ,这是它的devise案例:

 // invoke SUT ArgumentCaptor<SomeClass> argumentCaptor = ArgumentCaptor.forClass(SomeClass.class); verify(someObject).doSomething(argumentCaptor.capture()); SomeClass expected = // some expected value assertThat(argumentCaptor.getValue(), equalTo(expected)); 

它并不是说它可以用来存根,而是用存根来表示。

所以你可以像这样用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()会导致问题。