2011-07-08 11 views
48

Nie mam żadnego szczęścia, aby Mockito przechwycił wartości argumentów funkcji! Kpimy z indeksu wyszukiwarki i zamiast budować indeks, używam tylko hasha.wywołania zwrotne i uzyskiwanie wartości argumentów

// 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ć linię 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)) 

Spojrzałem na sekcję oddzwonień na stronie Using Mockito. Niestety nie jest to Java i nie mogłem uzyskać własnej interpretacji tego do pracy w Javie.

EDYCJA (dla wyjaśnienia): Jak mogę zmusić Mockito do przechwycenia argumentu X i przekazania go do mojej funkcji? Chcę dokładną wartość (lub ref) X przekazane do funkcji.

Nie chcę wyliczać wszystkich przypadków, a dowolny argument nie zadziała, ponieważ testuję różne wyniki dla różnych zapytań.

Mockito strona mówi

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

to nie jawa, a ja nie wiem jak to przetłumaczyć na Java lub przekazać cokolwiek się do funkcji.

+0

Nie jestem pewien, czy dokładnie rozumiem, co się u Ciebie nie udaje. Wezwanie do 'Mockito.when (read.document (666)). ThenReturn (document (fakeIndex (666))' powinien ustawić dla ciebie obiekt próbny Co stanie się, kiedy wywołasz 'reader.document (666)'? – highlycaffeinated

+0

666 działa dobrze, ale chciałbym móc przekazać konkretny numer X i uzyskać wynik fałszywego indeksu (X). Mam dużą liczbę potencjalnych dokumentów do testowania zapytań, a ja nie chcę wpisz je wszystkie – nflacco

Odpowiedz

60

Nigdy nie używałam Mockito, ale chcę się uczyć, więc tutaj jest. Jeśli ktoś mniej nieświadomy ode mnie odpowie, spróbuj najpierw odpowiedzi!

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])); 
    } 
}); 
+2

Właśnie zauważyłem link po prawej stronie do [Mockito: Jak sprawić, żeby metoda zwróciła argument, który został mu przekazany] (http://stackoverflow.com/questions/2684630/mockito-how-to -make-a-method-return-an-argument-that-was-passed-to-it) Wygląda na to, że jestem blisko, jeśli nie na miejscu. –

+0

silna reputacja użytkownika (666) na oryginalną korelację pytań! bardzo dobrze.Tylko zmiana, którą zrobiłem, aby kompilacja rzeczy została umieszczona publicznie przed Object response (wywołanie InvocationOnMock) .... – nflacco

40

Wyjazd 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()); 
    } 
    }); 
+1

Wow, nie wiedziałem, że możesz użyć 'ArgumentCaptor's do stubbingu. Istnieje jednak duże ostrzeżenie w tym linku. Postępuj ostrożnie. – einnocent

+2

Tak, masz rację. Wychwytujących należy używać tylko z weryfikacjami. – qualidafial

4

Z Java 8, może to być coś takiego:

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

jestem przy założeniu, że document jest mapa.

11

Możesz chcieć użyć zweryfikować() w połączeniu z ArgumentCaptor aby zapewnić wykonanie w teście i ArgumentCaptor ocenić argumenty:

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

wartość argumentu jest oczywiście dostępne za pośrednictwem argument.getValue () w celu dalszej manipulacji/sprawdzenia lub cokolwiek chcesz zrobić.

Powiązane problemy