Ответ 1
Предположим, что у вас есть следующий метод:
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));
Причина проста: вы можете использовать совпадение во время stubbing:
SomeClass expected = // some expected value
when(someObject.doSomething(eq(expected))).thenReturn(true);
// invoke SUT
Но проверка может быть другой. Скажем, вам не нужно заглушать doSomething
. Вы вполне довольны возвращаемым значением по умолчанию из mock (это будет false
). Поэтому вам не нужно заглушить. Но ваш тест должен гарантировать, что этот метод был вызван, и его аргумент был правильным. Затем вы используете ArgumentCaptor
, и это тот случай, для которого он предназначен:
// invoke SUT
ArgumentCaptor<SomeClass> argumentCaptor = ArgumentCaptor.forClass(SomeClass.class);
verify(someObject).doSomething(argumentCaptor.capture());
SomeClass expected = // some expected value
assertThat(argumentCaptor.getValue(), equalTo(expected));