Próbowałem uzyskać mock metody z parametrami vararg przy użyciu Mockito:
interface A {
B b(int x, int y, C... c);
}
A a = mock(A.class);
B b = mock(B.class);
when(a.b(anyInt(), anyInt(), any(C[].class))).thenReturn(b);
assertEquals(b, a.b(1, 2));
To nie działa, jeśli jednak zrobię to:
when(a.b(anyInt(), anyInt())).thenReturn(b);
assertEquals(b, a.b(1, 2));
Działa to pomimo tego, że całkowicie pominąłem argument varargs podczas krojenia metody.
Jakieś wskazówki?
java
mocking
variadic-functions
mockito
Qualidafial
źródło
źródło
Odpowiedzi:
Mockito 1.8.1 wprowadziło dopasowanie dopasowujące anyVararg () :
Zobacz także historię: https://code.google.com/archive/p/mockito/issues/62
Edytuj nową składnię po wycofaniu:
źródło
anyVararg()
ma Object jako typ zwracany. Aby był zgodny z dowolnymi typami argumentów var (np. String ..., Integer ... itp.), Wykonaj jawne rzutowanie. Na przykład, jeśli maszdoSomething(Integer number, String ... args)
, możesz wykonać próbny kod / skrót za pomocą czegoś takiego jakwhen(mock).doSomething(eq(1), (String) anyVarargs())
. To powinno zająć się błędem kompilacji.Matchers
jest teraz przestarzałe, aby uniknąćorg.hamcrest.Matchers
kolizji nazw z klasą i prawdopodobnie zostanie usunięte w mockito v3.0. UżyjArgumentMatchers
zamiast tego.Nieco nieudokumentowana funkcja: jeśli chcesz opracować niestandardowy Matcher, który pasuje do argumentów vararg, musisz mieć go zaimplementowany
org.mockito.internal.matchers.VarargMatcher
, aby działał poprawnie. Jest to interfejs z pustymi znacznikami, bez którego Mockito nie będzie poprawnie porównywał argumentów podczas wywoływania metody z varargami przy użyciu Twojego Matchera.Na przykład:
źródło
Opierając się na odpowiedzi Eli Levine'a, jest to bardziej ogólne rozwiązanie:
Następnie możesz go użyć z dopasowującymi tablicami hamcrest w ten sposób:
(Oczywiście import statyczny sprawi, że będzie to bardziej czytelne).
źródło
Używałem kodu w odpowiedzi Petera Westmacotta, jednak z Mockito 2.2.15 możesz teraz wykonać następujące czynności:
verify(a).method(100L, arg1, arg2, arg3)
gdzie
arg1, arg2, arg3
są varargi.źródło
Opierając się na odpowiedzi Topchefa,
W wersji 2.0.31-beta musiałem użyć Mockito.anyVararg zamiast Matchers.anyVararrg:
źródło
W moim przypadku sygnatura metody, którą chcę uchwycić jej argument to:
W tym przypadku powinieneś jawnie rzutować na tablicę bajtów :
Używam wersji mockito
1.10.19
źródło
Możesz także zapętlić argumenty:
na przykład sprawdź ich typy i rzuć je odpowiednio, dodaj do listy lub cokolwiek innego.
źródło
Dostosowanie odpowiedzi z @topchef,
Zgodnie z dokumentacją java dla Mockito 2.23.4, Mockito.any () „Dopasowuje wszystko, w tym wartości null i varargs”.
źródło
Możesz to osiągnąć, przekazując przechwycenie ArgumentCaptor, a następnie pobierając varargs jako listę za pomocą „getAllValues”, patrz: https://stackoverflow.com/a/55621731/11342928
źródło