Мне не удалось заставить 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))
Я просмотрел раздел обратных вызовов на странице « Использование Mockito» . К сожалению, это не Java, и я не мог получить собственную интерпретацию этого для работы на Java.
ИЗМЕНИТЬ (для пояснения): Как заставить Mockito захватить аргумент X и передать его в мою функцию? Я хочу, чтобы точное значение (или ссылка) X было передано функции.
Я не хочу перечислять все случаи, и произвольный аргумент не сработает, потому что я проверяю разные результаты для разных запросов.
На странице Mockito говорится
val mockedList = mock[List[String]]
mockedList.get(anyInt) answers { i => "The parameter is " + i.toString }
Это не java, и я не знаю, как перевести на java или передать то, что произошло, в функцию.
источник
Mockito.when(reader.document(666)).thenReturn(document(fakeIndex(666))
должен настроить для вас фиктивный объект. Что происходит, когда вы звонитеreader.document(666)
?Ответы:
Я никогда не использовал Mockito, но хочу научиться, так что начнем. Если ответит кто-то менее невежественный, чем я, сначала попробуйте его ответ!
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])); } });
источник
Проверьте ArgumentCaptors:
https://site.mockito.org/javadoc/current/org/mockito/ArgumentCaptor.html
ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class); Mockito.when(reader.document(argument.capture())).thenAnswer( new Answer() { Object answer(InvocationOnMock invocation) { return document(argument.getValue()); } });
источник
ArgumentCaptor
s для заглушки. Однако в этой ссылке есть большое предупреждение об этом. Действовать с осторожностью.Вы можете использовать verify () в сочетании с ArgumentCaptor, чтобы гарантировать выполнение в тесте, и ArgumentCaptor для оценки аргументов:
Очевидно, что значение аргумента доступно через arguments.getValue () для дальнейших манипуляций / проверки или того, что вы хотите сделать.
источник
В Java 8 это могло быть примерно так:
Mockito.when(reader.document(anyInt())).thenAnswer( (InvocationOnMock invocation) -> document(invocation.getArguments()[0]));
Я предполагаю, что
document
это карта.источник