如何使用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()会导致问题。