mockito обратные вызовы и получение значений аргументов
мне не повезло получить 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.
изменить (для уточнения): Как мне получить get Mockito, чтобы захватить аргумент X и передать его в мою функцию? Я хочу, чтобы точное значение (или ref) X передавалось функции.
Я не хочу перечислять все случаи, и произвольный аргумент не будет работать, потому что я тестирую разные результаты для разных запросов.
страница Mockito говорит
val mockedList = mock[List[String]]
mockedList.get(anyInt) answers { i => "The parameter is " + i.toString }
Это не java, и я не знаю, как перевести на java или передать все, что произошло в функцию.
4 ответа:
Я никогда не использовал 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:
http://site.mockito.org/mockito/docs/1.10.19/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()); } });
вы можете использовать verify () в сочетании с ArgumentCaptor для обеспечения выполнения в тесте и ArgumentCaptor для оценки аргументов:
ArgumentCaptor<Document> argument = ArgumentCaptor.forClass(Document.class); verify(reader).document(argument.capture()); assertEquals(*expected value here*, argument.getValue());
значение аргумента, очевидно, доступно через аргумент.getValue () для дальнейших манипуляций / проверки или все, что вы хотите сделать.