Nie mam szczęścia, aby Mockito przechwytywał wartości argumentów funkcji! Kpię z indeksu wyszukiwarki i zamiast budować indeks, używam tylko skrótu.
// 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))
Nie mogę używać dowolnych argumentów, ponieważ testuję wyniki zapytań (tj. Które dokumenty zwracają). Podobnie nie chcę określać konkretnej wartości i mieć wiersz dla każdego dokumentu!
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))
Przejrzałem sekcję wywołań zwrotnych na stronie Korzystanie z Mockito . Niestety, to nie jest Java i nie mogłem uzyskać własnej interpretacji tego do pracy w Javie.
EDYCJA (dla wyjaśnienia): Jak zmusić Mockito do przechwycenia argumentu X i przekazania go do mojej funkcji? Chcę dokładnej wartości (lub ref) X przekazanej do funkcji.
Nie chcę wyliczać wszystkich przypadków, a dowolny argument nie zadziała, ponieważ testuję różne wyniki dla różnych zapytań.
Mówi strona Mockito
val mockedList = mock[List[String]]
mockedList.get(anyInt) answers { i => "The parameter is " + i.toString }
To nie jest java i nie wiem, jak przetłumaczyć na język java ani przekazać tego, co się stało, do funkcji.
źródło
Mockito.when(reader.document(666)).thenReturn(document(fakeIndex(666))
powinno ustawić dla ciebie obiekt pozorowany. Co się dzieje, kiedy dzwoniszreader.document(666)
?Odpowiedzi:
Nigdy nie korzystałem z Mockito, ale chcę się uczyć, więc proszę bardzo. Jeśli ktoś mniej wiedzący ode mnie odpowie, najpierw wypróbuj jego odpowiedź!
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])); } });
źródło
Sprawdź 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()); } });
źródło
ArgumentCaptor
s do zarostu. W tym linku jest jednak wielkie ostrzeżenie na ten temat. Postępuj ostrożnie.Możesz chcieć użyć weryfikacji () w połączeniu z ArgumentCaptor, aby zapewnić wykonanie w teście i ArgumentCaptor, aby ocenić argumenty:
Wartość argumentu jest oczywiście dostępna poprzez argument.getValue () w celu dalszej manipulacji / sprawdzania lub czegokolwiek innego, co chcesz zrobić.
źródło
W Javie 8 może to wyglądać mniej więcej tak:
Mockito.when(reader.document(anyInt())).thenAnswer( (InvocationOnMock invocation) -> document(invocation.getArguments()[0]));
Zakładam, że
document
to mapa.źródło