Подтвердить что ты не робот

Mockito callbacks и получение значений аргументов

Мне не повезло получить Mockito для захвата значений аргументов функции! Я высмеиваю индекс поисковой системы и вместо создания индекса, я просто использую хэш.

// Fake index for solr
Hashmap<Integer,Document> fakeIndex;

// Add a document 666 to the fakeIndex
SolrIndexReader reader = Mockito.mock(SolrIndexReader.class);

// Give the reader access to the fake index
Mockito.when(reader.document(666)).thenReturn(document(fakeIndex(666))

Я не могу использовать произвольные аргументы, потому что я проверяю результаты запросов (т.е. какие документы они возвращают). Аналогично, я не хочу указывать конкретное значение и иметь строку для каждого документа!

Mockito.when(reader.document(0)).thenReturn(document(fakeIndex(0))
Mockito.when(reader.document(1)).thenReturn(document(fakeIndex(1))
....
Mockito.when(reader.document(n)).thenReturn(document(fakeIndex(n))

Я просмотрел раздел обратных вызовов на странице Using Mockito. К сожалению, это не Java, и я не мог получить свою собственную интерпретацию этого для работы на Java.

EDIT (для уточнения): Как мне получить Mockito, чтобы захватить аргумент X и передать его в мою функцию? Я хочу, чтобы точное значение (или ref) X передавалось функции.

Я не хочу перечислять все случаи, и произвольный аргумент не будет работать, потому что я тестирую разные результаты для разных запросов.

На странице Mockito говорится:

val mockedList = mock[List[String]]
mockedList.get(anyInt) answers { i => "The parameter is " + i.toString } 

Это не java, и я не знаю, как перевести в java или передать все, что произошло в функцию.

4b9b3361

Ответ 1

Я никогда не использовал Мокито, но хочу учиться, так что здесь. Если кто-то менее невежественный, чем я, ответьте, сначала попробуйте свой ответ!

Mockito.when(reader.document(anyInt())).thenAnswer(new Answer() {
 public Object answer(InvocationOnMock invocation) {
     Object[] args = invocation.getArguments();
     Object mock = invocation.getMock();
     return document(fakeIndex((int)(Integer)args[0]));
     }
 });

Ответ 3

Возможно, вы захотите использовать verify() в сочетании с ArgumentCaptor, чтобы обеспечить выполнение в тесте и ArgumentCaptor для оценки аргументов:

ArgumentCaptor<Document> argument = ArgumentCaptor.forClass(Document.class);
verify(reader).document(argument.capture());
assertEquals(*expected value here*, argument.getValue());

Значение аргумента очевидно доступно через argument.getValue() для дальнейшей обработки/проверки или того, что вы хотите сделать.

Ответ 4

С Java 8 это может быть примерно так:

Mockito.when(reader.document(anyInt())).thenAnswer(
  (InvocationOnMock invocation) -> document(invocation.getArguments()[0]));

Я предполагаю, что document является отображением.